때로는 다음과 같은 일을 하고 싶을 때가 있습니다.
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
?
(저는 zsh
Debian 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>