Como executar um script quando um flash drive específico é montado?

44

Existe uma maneira de executar um script quando um determinado dispositivo USB é montado?

Eu mantenho meus vídeos em um USB separado e gostaria de executar um script que montaria a pasta de vídeo no dispositivo USB para o da pasta inicial.

    
por Braiam 06.02.2011 / 22:00

7 respostas

29

Comece por encontrar o seu dispositivo em lsusb . Anote o ID (por exemplo, 0a81:0101 )

Crie um novo arquivo de regras do udev em /etc/udev/rules.d/ via sudoedit /etc/udev/rules.d/100-mount-videos.rules e insira uma nova regra lá assim:

ACTION=="add", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0101", RUN+="/home/your_username/bin/mount_videos.sh"

Note como usei o ID de lsusb .

Então você só precisa escrever o script para fazer o trabalho. Um simples comando de montagem deve funcionar. Você pode precisar de um comando sleep 5 para esperar que o sistema de arquivos seja inicializado (se você deixar o gnome para fazer a montagem principal - mas você está livre para montá-lo primeiro e então você pode não precisar dormir).

Adição de Allan: Scripts de execução longa podem bloquear "todos os demais eventos para este ou um dispositivo dependente". A página man do My Mint afirma ainda que "As tarefas de execução demorada precisam ser imediatamente desconectadas do próprio processo do evento". Nenhuma dica é dada sobre onde obter a habilidade para fazer isso.

Resposta de Oli: Embrulhe da seguinte forma: link

    
por Oli 07.02.2011 / 00:54
26

Há uma solução muito melhor com o systemd agora. Você cria um serviço que depende e é desejado pela sua mídia, por exemplo: /etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/home/you/bin/triggerScript.sh

[Install]
WantedBy=media-YourMediaLabel.mount

Em seguida, você precisa iniciar / ativar o serviço:
sudo systemctl start your.service e sudo systemctl enable your.service

Após a instalação, o systemd aciona seu script de acionador. A vantagem sobre a regra do udev é que o script é realmente acionado após a montagem, não depois de adicionar o dispositivo do sistema.

Caso de uso : Eu tenho uma partição criptografada que quero fazer backup automaticamente. Depois de adicionar o dispositivo, eu tenho que digitar a senha. Se eu conectei o script de backup ao udev, o script tenta ser executado no momento em que estou digitando a senha, o que falhará.

Recurso: Criação de scripts com o udev

Observação: você pode encontrar sua unidade de dispositivo com: sudo systemctl list-units -t mount

    
por sumid 29.09.2015 / 10:51
8

Outra maneira de obter os valores para o ATTRS {idVendor} e o ATTRS {idProduct} (testado no Ubuntu 12.04) é:

  1. Descubra onde o seu usb está montado:

    $ mount | grep /dev/sd*
    

    isto mostra algo como o seguinte:

    /dev/sdb on /media/SOMEDIR type vfat ...
    
  2. Use o udevadm para obter informações sobre o dispositivo:

    udevadm info -q all -n /dev/sdb | grep -E -i -w '.*VENDOR_ID.*|.*MODEL_ID.*'
    

    a saída deve ser algo como:

    E: ID_MODEL_ID=001a
    E: ID_VENDOR_ID=002b
    
  3. Agora, use o ID do modelo para o ATTRS {idProduct} e o ID do fornecedor para o ATTRS {idVendor}

    ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...
    
por emont01 19.09.2012 / 01:11
1

No Nautilus em Editar > Preferências > Mídia, você pode escolher "outra ação" e "Comando Costum". para diferentes tipos de mídia a serem executados. A essa altura, a unidade usb já está montada, mas suponho que você ainda possa vinculá-la (com um comando costum) à pasta na qual deseja que a unidade apareça. Eu não sabia dizer se isso é mais fácil ou melhor que usar o udev.

    
por bacon 06.02.2011 / 23:53
1

Se você não quer interferir no controle do seu gerenciador de arquivos (nautilus, konquerer, gnome, etc) sobre a montagem e desmontagem do seu dispositivo, sugiro que não siga a rota do udev.

Em vez disso, use udisks-glue se o seu sistema usa os udisks (quase todos usam).

Após a instalação, basta criar um arquivo de configuração ~/.udisks-glue.conf em seu diretório inicial como este.

Meu exemplo a seguir atualiza os dados do GPS Assist na minha câmera toda vez que eu conecto o cartão SD.

filter BT16EXTREME {
  optical = false
  partition_table = false
  usage = filesystem
  label = BT16EXTREME
}
match BT16EXTREME {
  post_mount_command = "/home/bernhard/update-gps-assist-data.pl %mount_point"
}

Depois disso, certifique-se de que o udisks-glue seja iniciado quando você inicializar ou efetuar login. Ou seja via aplicativos de inicialização do gnome

    
por xro 24.11.2014 / 04:10
0

use o udev

link

    
por user10333 06.02.2011 / 22:11
0

A resposta de @ sumid tem um problema. Você deve não iniciar o serviço. Você só precisa ativá-lo.

arquivo

: /etc/systemd/system/your.service

[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount

[Service]
ExecStart=/any_path_even_inside_the_mount_point/script.sh

[Install]
WantedBy=media-YourMediaLabel.mount

Em seguida, ative o serviço:

sudo systemctl enable your.service

Isso é tudo.

Nota: pode encontrar o seu marcador medial com: sudo systemctl list-units -t mount

Observação2: Se o serviço falhar de alguma forma (por exemplo, o script não é executável), seu ponto de montagem mudará para <old_mount_point_name>1 da próxima vez que você montar o dispositivo usb. Para corrigir esse problema, você só precisa executar sudo systemctl reset-failed

    
por sgon00 11.12.2017 / 11:57

Tags