Estou escrevendo um script bash inotifywait
para monitorar um diretório e iniciar ações quando alterações são detectadas. Algo como:
inotifywait -m ... | while read f; do something; done
Como inotifywait
não termina sozinho, esse script não será interrompido.
Portanto, meu plano era obter o PID do processo inotifywait, salvá-lo em um arquivo e fazer com que um processo diferente o matasse posteriormente, digamos:
inotifywait -m ... | { echo ??PID?? > pid-file; while ... }
Mas não sei como obter o PID. Existe uma maneira simples de conseguir isso? Outra maneira é salvar o PID do script de shell $$
no arquivo e matar o script de shell inteiro, mas eu queria fazer uma limpeza após o loop while.
Eu tentei usar coproc
e acho que vai funcionar, mas parece mais complicação do que o necessário.
pgrep inotifywait
. Isso lhe dará o PID, para matarpkill inotifwait
,.grep -v grep
, masps -ef | grep [p]rocessname...
faria o mesmo.-f
opção se precisar comparar com mais nomes dos executáveis.Respostas:
Em um pipeline, todos os processos são iniciados simultaneamente , não há um que seja anterior aos outros.
Você poderia fazer:
Ou portably:
Observe também que quando o subshell que executa o
while
loop terminar,inotifywait
ele será eliminado automaticamente na próxima vez em que gravar algo no stdout.fonte
Se você precisar do ID do processo no loop, imprima-o primeiro.
fonte
Esta resposta SO parece aplicável:
fonte