Como executar scripts personalizados no plug-in de dispositivo USB?
41
Qual é o método mais avançado para executar automaticamente scripts personalizados no plug-in de dispositivo USB nas distribuições atuais do Linux como Debian / CentOS / Fedora?
Por exemplo, se você deseja montar / copiar automaticamente alguns arquivos / montar um dispositivo de armazenamento em massa USB com base em seu UUID (ou ID do dispositivo etc.).
Adicione uma cláusula como NAME="subdir/mydisk%n"se você deseja usar um caminho de entrada personalizado em /dev.
Execute udevadm info -a -n sdbpara ver com quais atributos você pode comparar ( attribute=="value"; substitua sdbpelo nome do dispositivo atribuído automaticamente ao disco, correspondente à nova entrada criada /devquando você o conecta). Note que você pode usar ATTRScláusulas de qualquer uma estrofe: você pode escolher qualquer estrofe, mas as ATTRScláusulas devem todos vêm da mesma estrofe, você não pode misturar e combinar. Você pode misturar ATTRScláusulas com outros tipos de cláusulas listadas em uma estrofe diferente.
Esta resposta ainda é válida? Sob nenhuma quantidade de mexerico posso obter o script para executar (e tocar em um arquivo). Se você puder fornecer o exemplo mais básico que executa um script quando algo estiver conectado, isso seria ótimo e podemos trabalhar a partir daí.
Redsandro 22/02
@Redsandro Eu tenho variações dessa regra na minha configuração do udev e elas estão funcionando. Você conectou e conectou o dispositivo ou executou udevadm trigger? Seu sistema usa o udev? Se você deseja executar um script quando algo estiver conectado, remova todas as condições (as cláusulas com ==) (talvez a sintaxe exija uma condição, não tenho certeza; se isso acontecer, use KERNEL=="*").
Gilles 'SO- stop be evil'
Eu tentei isso também, mas, como funciona para você, devo estar perdendo um passo. Tenho mudou essa questão aqui , para que eu possa escrever exemplo de código.
Redsandro 22/02
Talvez relacionado, acho que há um prazo para quanto tempo o script pode ser executado. Eu acredito que é muito curto (como 1 segundo ou algo assim). Se demorar mais do que isso, o udev o matará. Você pode contornar isso usando o script em segundo plano com algo parecido at. Veja "executando programas externos" em reactivated.net/writing_udev_rules.html
cheshirekow
Só para acrescentar a isto, por uma questão de exaustividade, as necessidades de arquivo para ter o sufixo .rulese os arquivos no diretório são lidos em uma ordem lexical (convenção usa prefixo numérico para encomendá-los), e eles podem ser abaixo /etc/, /usr/libou /run. Para mais, RTFM .
starfry
14
Procurei /lib/udev/rules.dexemplos de regras relacionadas ao disco. Em um sistema Ubuntu, um arquivo de regra fornece a variável de ambiente ID_FS_UUID_ENCque você pode usar em seus próprios arquivos de regra.
Assim, coloquei um arquivo de regras personalizado /etc/udev/rules.d/foodevice.rules. Como não é prefixado com um número, ele é finalmente executado pelo udev. Aliás, o daemon udev observou /etc/udev/rules.dalterações, de modo que você não precisa reiniciá-lo nas alterações de arquivo.
(esta é uma regra - você deve remover a nova linha após a cláusula ENV porque o udev não possui um mecanismo de continuação de linha)
Um programa iniciado pelo udev bloqueia o daemon - portanto, não deve ser executado por um longo tempo. Eu resolvi isso via at- ou seja, via desanexação do processo realizando o trabalho real:
$ cat /home/juser/path/script.sh
#!/bin/sh
echo ~/path/mountcopystuff.sh | at now
Pode ser necessário recarregar as regras do udev usando udevadm control --reload-rules, dependendo da sua distribuição.
user44038
11
Em vez de at nowsugerir batch.
Reintegrar Monica - M. Schröder
O que fazer quando você não tem nem atnem batch? Estou em um ambiente incorporado com o busybox .
Natelho 27/04
@natenho, você pode usar ~/path/mountcopystuff.sh &- atetc. tem a vantagem de receber notificações por e-mail caso algo dê errado - mas em um sistema incorporado isso provavelmente não é de grande interesse.
udevadm trigger
? Seu sistema usa o udev? Se você deseja executar um script quando algo estiver conectado, remova todas as condições (as cláusulas com==
) (talvez a sintaxe exija uma condição, não tenho certeza; se isso acontecer, useKERNEL=="*"
).at
. Veja "executando programas externos" em reactivated.net/writing_udev_rules.html.rules
e os arquivos no diretório são lidos em uma ordem lexical (convenção usa prefixo numérico para encomendá-los), e eles podem ser abaixo/etc/
,/usr/lib
ou/run
. Para mais, RTFM .Procurei
/lib/udev/rules.d
exemplos de regras relacionadas ao disco. Em um sistema Ubuntu, um arquivo de regra fornece a variável de ambienteID_FS_UUID_ENC
que você pode usar em seus próprios arquivos de regra.Assim, coloquei um arquivo de regras personalizado
/etc/udev/rules.d/foodevice.rules
. Como não é prefixado com um número, ele é finalmente executado pelo udev. Aliás, o daemon udev observou/etc/udev/rules.d
alterações, de modo que você não precisa reiniciá-lo nas alterações de arquivo.O conteúdo de
/etc/udev/rules.d/foodevice.rules
é:(esta é uma regra - você deve remover a nova linha após a cláusula ENV porque o udev não possui um mecanismo de continuação de linha)
Um programa iniciado pelo udev bloqueia o daemon - portanto, não deve ser executado por um longo tempo. Eu resolvi isso via
at
- ou seja, via desanexação do processo realizando o trabalho real:fonte
udevadm control --reload-rules
, dependendo da sua distribuição.at now
sugerirbatch
.at
nembatch
? Estou em um ambiente incorporado com o busybox .~/path/mountcopystuff.sh &
-at
etc. tem a vantagem de receber notificações por e-mail caso algo dê errado - mas em um sistema incorporado isso provavelmente não é de grande interesse.