스크립트를 종료하지 않고 동일한 스크립트에서 시작된 백그라운드 프로세스를 중지하는 방법은 무엇입니까?

스크립트를 종료하지 않고 동일한 스크립트에서 시작된 백그라운드 프로세스를 중지하는 방법은 무엇입니까?

가변적인 시간(2분 이내) 동안 실행되는 프로그램이 있는데, 덜 짜증나게 하기 위해 행운의 메시지를 추가했습니다.

 #!/bin/bash
 ...
 for i in $(seq 1 45); do sleep 3; echo; echo; fortune; done &
 ...

그러나 프로그램 지속 시간은 (여기서 관련되지 않은 요인에 따라) 달라질 수 있으며 중지 메시지가 필요합니다.

 #!/bin/bash
 ...
 for i in $(seq 1 45); do sleep 3; echo; echo; fortune; done &
 ...
 if [any-condition]; Then
      #script is over... Stop messages!!!
 fi
 ...
 if [any-condition]; Then
      #Stop messages... script continue execution
 fi
 ... Blah blah
 ...
 #script is over stop Messages!

그래서 3초에 45개의 메시지를 준비하면 프로그램은 빨리 종료될 수 있지만 단말기에는 여전히 메시지가 나타나 다른 작업을 방해하게 됩니다.

명령을 사용해 보았지만 jobs백그라운드에 작업이 없습니다. 명령을 사용해 보았지만 ps메시지 작업을 찾을 수 없습니다.

이 행운의 메시지를 어떻게 막을 수 있나요?

답변1

가장 쉬운 방법은 를 사용하는 것입니다 $!. 이것은 백그라운드에서 시작된 마지막 프로세스의 PID입니다 man bash.

!

비동기 명령으로 실행되거나 bg 내장 명령을 사용하여 가장 최근에 백그라운드에 추가된 작업의 프로세스 ID로 확장됩니다.

따라서 다음과 같이 할 수 있습니다.

for i in $(seq 1 45); do sleep 3; echo; echo; fortune; done &
pid=$!

[ main script here]

if [any-condition]; then
  kill $pid
fi

그러나 나는 이것이 일을 하는 다소 복잡한 방법이라고 생각하지 않을 수 없습니다. 전체 스크립트를 보여주면 좀 더 구체적인 예를 제시할 수 있지만 다음과 같은 것은 왜 안 됩니까?

long_process &
while ps -p $! >/dev/null; do sleep 3; echo; echo; fortune; done 

이렇게 하면 시간이 오래 걸리고 fortune끝날 때까지 실행되는 모든 프로세스를 시작할 수 있습니다.

관련 정보