프로세스가 완료되면 뭔가를 하세요

프로세스가 완료되면 뭔가를 하세요

때로는 다음과 같은 일을 하고 싶을 때가 있습니다.

long_running_command; second_command

그 부분을 잊어버렸어요 ; second_command. 중단하고 다시 시작하고 싶지 않은 경우 long_running_command(때로는 불가능할 때도 있고 오류를 발견하기 전에 오랫동안 실행되어 작업이 낭비될 수도 있음) 일반적으로 다음과 같은 작업을 수행합니다.

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

(다른 터미널에서)
작동하면 다음 오류가 발생합니다.

kill: kill <pid> failed: no such process

해당 오류를 방지할 수 있는 방법이 있습니까? 아니면 완료 second_command되자마자 일정을 잡는 더 좋은 방법이 있습니까 long_running_command?

(저는 zshDebian Jessie를 사용하고 있습니다).

답변1

Debian(Linux)이 주어지고 하나만 있다고 가정합니다 long_running_command.

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

또는 PID를 알고 있는 경우:

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

일반적인 상황인 경우:

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

답변2

zsh 쉘에 내장된 wait명령을 사용해 보십시오. 그러면 해당 작업이 자동으로 수행됩니다.

% 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

위의 작업 사양 대신 PID를 사용할 수도 있습니다. 그래서,:

% 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

Bash의 의미도 동일합니다.

답변3

이 코드는 트릭을 수행해야 합니다. 명령을 찾을 수 없으면 루프가 중단되고 두 번째 명령이 실행됩니다.

while [ -n "$(pgrep <executed command>)" ]; do sleep 0.1; done; <second command>

관련 정보