Fazendo algo quando um processo termina

1

Às vezes, quando eu queria fazer algo como:

long_running_command; second_command

Eu esqueci a parte ; second_command . Se eu não quiser interromper e reiniciar o long_running_command (às vezes não é possível, outras vezes ele foi executado por um tempo significativo antes de eu descobrir o meu erro e esse trabalho seria desperdiçado), eu normalmente faço algo como

ps aux | grep long_running_command 
while (kill -0 <pid found above>); do sleep 1; done; second_command

(em outro terminal)
e enquanto funciona, resulta no seguinte erro:

kill: kill <pid> failed: no such process

Existe uma maneira de evitar esse erro ou uma maneira melhor de agendar second_command logo após o long_running_command terminar.

(eu uso zsh no Debian Jessie).

    
por Henrik 07.08.2017 / 20:06

2 respostas

1

Dado o Debian (Linux) e assumindo que existe apenas um long_running_command :

while [ -d /proc/$(pgrep -f 'long_running_command') ]; do sleep 0.1; done;  second_command

Ou, se você conhece o PID:

while [ -d /proc/PID-HERE ]; do sleep 0.1; done; second_command

Se é uma situação comum:

waitrun() {
  while [ -d /proc/$1 ]; do sleep 0.1; done;
  shift
  "$@"
}
waitrun PIDHERE second_command
    
por 07.08.2017 / 21:51
0

Tente usar o comando wait interno do zsh shell - ele fará o trabalho para você.

% date; sleep 30s &
Tue Aug  8 22:24:07 EDT 2017
[1] 31875
% wait %1; date
[1]  + done       sleep 30s
Tue Aug  8 22:24:37 EDT 2017

Você também pode usar um PID em vez das especificações do trabalho acima. Então,

% date; sleep 30s &
Tue Aug  8 22:26:04 EDT 2017
[1] 1821
% wait 1821; date
[1]  + done       sleep 30s
Tue Aug  8 22:26:34 EDT 2017

As semânticas são as mesmas no bash também.

    
por 09.08.2017 / 04:30