Faça um comando em todos os shells abertos

3

Eu uso o sshfs para fazer coisas úteis na minha caixa de desenvolvimento. Eu amo isso. Mas, normalmente, esqueço de fusermount -u antes de fechar a tampa (ativando o modo de hibernação). Então, quando eu volto, o sshfs está congelado e eu tenho que limpar.

Eu prefiro ter um script em /etc/pm/sleep.d que repita todos os meus pontos de montagem sshfs e DWIM. Eu tenho o código fusermount -u escrito com df -l checks. Mas, nos testes, determinei que também preciso fazer o cd de todos os pontos de montagem para que o fusermount -u funcione.

Mas, não consigo descobrir como iterar nos meus terminais abertos e fazer coisas úteis neles. Ajuda?

    
por Rob Kinyon 18.06.2015 / 21:06

1 resposta

2

Você pode fazer isso registrando um manipulador de sinal de usuário personalizado em ~/.bashrc :

trap '[ "$PWD" = "/my/sshfs/mount" ] && cd ~' SIGUSR1

Em seguida, esse manipulador será chamado sempre que você enviar um sinal SIGUSR1 para os processos bash:

killall -u "$USER" -USR1 bash

Isso vem com algumas ressalvas:

  • O manipulador de sinal deve ser registrado para todas as instâncias bash (interativas e não interativas), caso contrário, a ação padrão (quit) será executada. Eu acho que usar ~/.bashrc geralmente faz isso. No entanto, existem opções para bash que irão substituir o fornecimento deste arquivo de inicialização.
  • Qualquer um dos processos do shell pode estar no meio de algo que depende de estar no diretório sshfs fornecido. A mudança aleatória desse diretório pode causar um comportamento arbitrário indefinido, dependendo do que o script fornecido está fazendo no momento (ou mais tarde).
  • Pode haver outros processos iniciados a partir de um processo bash que ainda estão no diretório fornecido. Não há muita coisa que possa ser feita para esses processos, outros matando-os.
por 18.06.2015 / 23:01

Tags