다른 쉘에서 시작된 프로그램을 기다리는 방법


20

작업하는 모든 데이터가 사용 가능 해지면 cron에서 시작하는 많은 양의 작업 (약 4-5 시간 소요)을 수행하는 프로그램이 있습니다. 때때로, 나는 그것이 끝날 때까지 기다릴 때 다른 (대화식) 프로그램이 끝날 때 시작할 수 있기를 원합니다. 대기 통화는 유망 해 보이지만 어린이 만 기다립니다.


내가 생각할 수있는 유일한 다른 방법은 cronjob에서 파일을 만든 다음 해당 프로세스에서 inotifywait를 사용하는 것입니다. 파일이 삭제되면 두 번째 프로세스 (inotifywait 실행)를 시작할 수 있습니다.
slm

ipc프로세스 간 통신을 사용하여 이러한 라인을 따라 무언가를 할 수 있다고 생각합니다 . man ipc.
slm

다시 시작하는 서비스를보고 있지는 않지만이 Q & A에 언급 된 God, Monit 또는 다른 pkg 중 하나가 작업을 수행합니다. unix.stackexchange.com/questions/75785/…
slm

@slm은 모든 파일 시스템에서 inotify를 사용할 수 있습니다. 예를 들어 / proc / _pid_ / fd / 1에서 close_write를 기다 립니까?
15 분 21 초에 hildred

완전히 확실하지는 않지만 8-) 다른 방법 일 수 있습니다. inotifywait (파일의 경우)와 비슷한 프로세스 모니터링과 관련된 새로운 커널 기능이있는 곳을 기억하는 Q가있었습니다. 이 새로운 기능은 진행중인 이벤트를위한 것이 었습니다. 많은 Q & A가 제 생각에 함께 시작됩니다. 8-). 나는 A 또는 나와 Gilles에 의해 제공되었다고 생각합니다.
slm

답변:


13

나는 EDIT # 3 솔루션을 확실히 선호합니다 (아래 참조).

동일한 쉘에 있지 않은 경우 ps -p의 조건을 가진 while 루프를 사용하여 true를 리턴하십시오. 풋 잠을 프로세서 사용을 줄이기 위해 루프.

while ps -p <pid> >/dev/null 2>&1
do
   sleep 10
done 

또는 UNIX가 / proc을 지원하는 경우 (예 : HP-UX는 여전히 지원하지 않음).

while [[ -d /proc/<pid> ]]
do 
    sleep 10
done

타임 아웃을 원한다면

timeout=6  # timeout after 1mn  
while ((timeout > 0)) && ps -p <pid> >/dev/null 2>&1
do
   sleep 10
   ((timeout -= 1))
done 

편집 # 1

다른 방법이 있습니다 : cron을 사용하지 마십시오 . batch 명령을 사용 하여 작업을 쌓으십시오.

예를 들어 매일 모든 작업을 쌓을 수 있습니다. 일부 병렬 처리를 허용하도록 일괄 처리를 조정할 수 있으므로 차단 된 작업이 모든 스택을 중지하지는 않습니다 (운영 체제에 따라 다름).

편집 # 2

홈 디렉토리에 fifo를 작성하십시오.

$ mkfifo ~/tata

당신의 일의 끝에서 :

echo "it's done" > ~/tata

다른 직업이 시작될 때 (기다리는 사람) :

cat ~/tata 

폴링하지 않고 오래된 IO를 차단하는 것이 좋습니다.

편집 # 3

신호 사용하기 :

대기중인 스크립트 시작시 :

echo $$ >>~/WeAreStopped
kill -STOP $$

당신의 긴 일의 끝에서 :

if [[ -f ~/WeAreStopped ]] ; then
    xargs kill -CONT < ~/WeAreStopped
    rm ~/WeAreStopped
fi

설문 조사, !! 사랑스러운 결정 : 프로세서 시간 낭비 또는 수면 조정 시간. 더 나은 대답이 있어야합니다.
hildred

:) 폴링은 당신에게 좋습니다, 폴링은 무국적이며, 폴링은 신뢰할 수 있습니다.
Emmanuel

폴링이 느려 폴링으로 인해 프로세서 시간이 낭비됩니다.
14 분 53 초에 hildred

실행 시간이 0.01 초이면 4 시간 동안 실행 된 1440ps는 14.4 초를 소비했을 것입니다. 작업 종속성을 관리하는 스케줄러보다 훨씬 적음 : D
Emmanuel

나는 이것이 해킹 된 경우에도 이것이 가장 좋은 옵션이라고 생각합니다 : stackoverflow.com/questions/1058047/…
slm

5

일부 플래그를 사용하도록 cron 작업을 수정할 수 있습니다.

대신에

2  2 * * *           /path/my_binary

당신이 사용할 수있는

2  2 * * *           touch /tmp/i_m_running; /path/my_binary; rm /tmp/i_m_running

이 파일을 스크립트 또는 수동으로 모니터링하십시오. 존재하면 프로그램이 실행중인 것입니다. 그렇지 않으면 원하는대로 자유롭게 할 수 있습니다.

스크립트 샘플 :

while [[ -f /tmp/i_m_running ]] ; do
   sleep 10 ;
done
launch_whatever_you_want

을 사용하지 않으려는 경우 sleep스크립트를 수정하여 X 분당 한 번씩 cron을 통해 실행할 수 있습니다.

이 경우 스크립트 샘플은 다음과 같습니다.

[[ -f /tmp/i_m_running ]] && { echo "Too early" ; exit ; }
launch_whatever_you_want

이 방법은 cron 프로세스의 PID를 찾을 필요가 없으므로 조금 더 쉽습니다.


4

부모가 자식 프로세스 중 하나가 완료되기를 기다리는 것을 제외하고는 프로세스가 다른 프로세스가 완료되기를 기다리는 기능이 없습니다. 가능하면 스크립트를 통해 프로그램을 시작하십시오.

do_large_amount_of_work
start_interactive_program

예를 들어 cron 작업에서 많은 양의 작업을 시작하기 전에 세션 컨텍스트에서 대화식 프로그램을 시작하기 전에이를 수행 할 수없는 경우이를 수행하십시오.

do_large_amount_of_work
notify_completion

몇 가지 방법으로 구현할 수 notify_completion있습니다. 일부 데스크탑 환경은 알림 메커니즘을 제공합니다 ( 원격 X 디스플레이에서 창 열기 ( "디스플레이를 열 수없는 이유") 가 유용 할 수 있습니다). 파일 변경 알림을 사용하여 만들 수도 있습니다. Linux에서 파일 변경 알림 기능은 inotify 입니다.

do_large_amount_of_work
echo $? >/path/to/finished.stamp

창조에 반응하려면 /path/to/finished.stamp:

inotifywait -e close_write -q /path/to/finished.stamp
start_interactive_program

do_large_amount_of_work호출 방식을 변경할 수 없지만 마지막으로 수정 한 파일을 알고있는 경우 동일한 메커니즘을 사용하여 해당 파일을 닫을 때 반응 할 수 있습니다. 파일 이름 바꾸기와 같은 다른 이벤트에 반응 할 수도 있습니다 ( inotifywait가능성 목록은 설명서를 참조하십시오 ).


0

cronjob에 의해 트리거되는 스크립트가 빈 쉘 스크립트를 호출하여 필요한 경우 후속 태스크를 삽입 할 수있게하십시오.

Gilles의 접근 방식과 매우 유사합니다.

cronjob-task.sh 포함한다 :

# do_large_amount_of_work

./post-execute.sh

여기서 post-execute.sh당신은 당신이 후속 작업을 트리거 할 필요가 참조하지 않는 한 일반적으로 비어 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.