이미 실행 중인 명령이 완료된 후 명령을 실행하는 방법은 무엇입니까?

이미 실행 중인 명령이 완료된 후 명령을 실행하는 방법은 무엇입니까?

시간이 오래 걸릴 스크립트를 시작하면 스크립트를 시작한 후에 필연적으로 이를 깨닫고, 완료되면 일종의 경고를 할 수 있는 방법이 있었으면 좋겠습니다.

예를 들어 다음을 실행하면:

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

백그라운드에서 스크립트를 실행할 수 있습니다(단, 스크립트 출력( stdoutstderr)은 다른 곳으로 리디렉션하지 않는 한 계속해서 터미널로 이동합니다) 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내 목적에 가장 예쁘고 가장 안정적입니다.

관련 정보