Obtendo o PID do comando anteriormente no Pipeline

9

Estou escrevendo um script bash para usar inotifywait para monitorar um diretório e lançar ações quando forem detectadas alterações. Algo como:

inotifywait -m ... | while read f; do something; done

Como inotifywait não termina sozinho, esse script não será interrompido.

Então, meu plano era pegar o PID do processo inotifywait, salvá-lo em um arquivo e ter um processo diferente para matá-lo mais tarde, por exemplo:

inotifywait -m ... | { echo ??PID?? > pid-file; while ... }

Mas eu 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 todo o script de shell, mas eu queria fazer alguma limpeza após o loop while.

Eu tentei usar coproc e acho que vai funcionar, mas parece mais complicado do que o necessário.

    
por Adrian Pronk 03.12.2013 / 09:56

3 respostas

6

Em um pipeline, todos os processos são iniciados concorrentemente , não há nenhum que seja anterior aos outros.

Você poderia fazer:

(echo "$BASHPID" > pid-file; exec inotifywait -m ...) | while IFS= read -r...

Ou portavelmente:

sh -c 'echo "$$" > pid-file; exec inotifywait -m ...' | while IFS= read -r...

Observe também que, quando a subshell que executa o loop while terminar, inotifywait será eliminado automaticamente na próxima vez que gravar algo no stdout.

    
por 03.12.2013 / 10:49
3

Se você precisar do ID do processo no loop, imprima-o primeiro.

sh -c 'echo "$$"; exec inotifywait -m ...' | {
  read inotifywait_pid
  while IFS= read -r f; do
    …
    if …; then kill "$inotifywait_pid"; break;
  done
}
    
por 04.12.2013 / 01:53
1

Essa resposta do SO parece aplicável:

inotifywait -m file > >(while read f; do echo f; done) &
    
por 12.02.2017 / 21:44

Tags