![이미 실행 중인 명령이 완료된 후 명령을 실행하는 방법은 무엇입니까?](https://rvso.com/image/1289035/%EC%9D%B4%EB%AF%B8%20%EC%8B%A4%ED%96%89%20%EC%A4%91%EC%9D%B8%20%EB%AA%85%EB%A0%B9%EC%9D%B4%20%EC%99%84%EB%A3%8C%EB%90%9C%20%ED%9B%84%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
시간이 오래 걸릴 스크립트를 시작하면 스크립트를 시작한 후에 필연적으로 이를 깨닫고, 완료되면 일종의 경고를 할 수 있는 방법이 있었으면 좋겠습니다.
예를 들어 다음을 실행하면:
really_long_script.sh
Enter를 누르세요...완료된 후에 다른 명령을 어떻게 실행할 수 있나요?
답변1
여러 명령을 로 구분하여 ;
순차적으로 실행되도록 할 수 있습니다. 예를 들면 다음과 같습니다.
really_long_script.sh ; echo Finished
스크립트가 반환 코드 0(일반적으로 올바르게 실행되었음을 의미)으로 완료된 경우에만 다음 프로그램을 실행하려면 다음을 수행하십시오.
really_long_script.sh && echo OK
반대의 경우(즉, 현재 명령이 실패한 경우에만 계속):
really_long_script.sh || echo FAILED
백그라운드에서 스크립트를 실행할 수 있습니다(단, 스크립트 출력( stdout
및 stderr
)은 다른 곳으로 리디렉션하지 않는 한 계속해서 터미널로 이동합니다) wait
.
really_long_script.sh &
dosomethingelse
wait; echo Finished
이미 스크립트를 실행한 경우 를 사용하여 스크립트를 일시 중지한 Ctrl-Z
후 다음과 같이 실행할 수 있습니다.
fg ; echo Finished
fg
일시 중지된 프로세스를 전경으로 가져오는 위치 ( bg
로 시작한 것과 거의 유사하게 백그라운드에서 실행되도록 함 &
)
답변2
프로세스가 현재 tty에서 실행되지 않으면 다음을 시도하십시오.
watch -g ps -opid -p <pid>; mycommand
답변3
bash의 작업 제어를 사용할 수도 있습니다. 시작했다면
$ really_long_script.sh
그런 다음 Ctrl+Z를 눌러 일시 중지합니다.
^Z
[1]+ Stopped really_long_script.sh
$ bg
백그라운드에서 작업을 다시 시작합니다( 로 시작한 것처럼 really_long_script.sh &
). 그런 다음 이 백그라운드 작업을 기다릴 수 있습니다.
$ wait N && echo "Successfully completed"
여기서 N은 위와 같이 표시되는 작업 ID(다른 백그라운드 작업을 실행하지 않은 경우 1일 수 있음)입니다 [1]
.
답변4
얼마 전에 나는 다른 프로세스가 끝날 때까지 기다리는 스크립트를 작성했습니다. 올바르게 설정되어 있다면 NOISE_CMD
와 같은 것일 수 있습니다 .notify-send ...
DISPLAY
#!/bin/bash
NOISE_CMD="/usr/bin/mplayer -really-quiet $HOME/sfx/alarm-clock.mp3"
function usage() {
echo "Usage: $(basename "$0") [ PROCESS_NAME [ PGREP_ARGS... ] ]"
echo "Helpful arguments to pgrep are: -f -n -o -x"
}
if [ "$#" -gt 0 ] ; then
PATTERN="$1"
shift
PIDS="$(pgrep "$PATTERN" "$@")"
if [ -z "$PIDS" ] ; then
echo "No process matching pattern \"$PATTERN\" found."
exit
fi
echo "Waiting for:"
pgrep -l "$PATTERN" "$@"
for PID in $PIDS ; do
while [ -d "/proc/$PID" ] ; do
sleep 1
done
done
fi
exec $NOISE_CMD
아무런 논쟁도 하지 말고 즉시 소음을 내십시오. 이 동작은 편의를 위해 다음과 같은 것을 허용합니다(아래에서 스크립트를 호출한다고 가정 alarm.sh
).
apt-get upgrade ; ~/bin/alarm.sh
물론 이러한 스크립트를 사용하면 인스턴스가 다른 명령을 기다리고 있는 alarm.sh
인스턴스를 기다리게 하는 등 재미있는 일을 많이 할 수 있습니다. alarm.sh
또는 로그인한 다른 사용자의 일부 작업이 완료된 직후에 명령을 실행하는 경우... >:D
pgrep
프로세스 ID에 대한 종속성을 피하고 직접 조회하도록 허용 하려는 경우 위 스크립트의 이전 버전이 흥미로울 수 있습니다 .
#!/bin/bash
if [ "$#" -lt 2 -o ! -d "/proc/$1" ] ; then
echo "Usage: $(basename "$0") PID COMMAND [ ARGUMENTS... ]"
exit
fi
while [ -d "/proc/$1" ] ; do
sleep 1
done
shift
exec "$@"
주제에서 약간 벗어났지만 비슷한 상황에 유용합니다. 관심이 있을 수도 있습니다.reptyr
, 일부 (부모) 쉘에서 프로세스를 "훔쳐" 현재 쉘에서 실행하는 도구입니다. 나는 유사한 구현을 시도했으며 reptyr
내 목적에 가장 예쁘고 가장 안정적입니다.