작업하는 모든 데이터가 사용 가능 해지면 cron에서 시작하는 많은 양의 작업 (약 4-5 시간 소요)을 수행하는 프로그램이 있습니다. 때때로, 나는 그것이 끝날 때까지 기다릴 때 다른 (대화식) 프로그램이 끝날 때 시작할 수 있기를 원합니다. 대기 통화는 유망 해 보이지만 어린이 만 기다립니다.
ipc
프로세스 간 통신을 사용하여 이러한 라인을 따라 무언가를 할 수 있다고 생각합니다 . man ipc
.
작업하는 모든 데이터가 사용 가능 해지면 cron에서 시작하는 많은 양의 작업 (약 4-5 시간 소요)을 수행하는 프로그램이 있습니다. 때때로, 나는 그것이 끝날 때까지 기다릴 때 다른 (대화식) 프로그램이 끝날 때 시작할 수 있기를 원합니다. 대기 통화는 유망 해 보이지만 어린이 만 기다립니다.
ipc
프로세스 간 통신을 사용하여 이러한 라인을 따라 무언가를 할 수 있다고 생각합니다 . man ipc
.
답변:
나는 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
다른 방법이 있습니다 : cron을 사용하지 마십시오 . batch 명령을 사용 하여 작업을 쌓으십시오.
예를 들어 매일 모든 작업을 쌓을 수 있습니다. 일부 병렬 처리를 허용하도록 일괄 처리를 조정할 수 있으므로 차단 된 작업이 모든 스택을 중지하지는 않습니다 (운영 체제에 따라 다름).
홈 디렉토리에 fifo를 작성하십시오.
$ mkfifo ~/tata
당신의 일의 끝에서 :
echo "it's done" > ~/tata
다른 직업이 시작될 때 (기다리는 사람) :
cat ~/tata
폴링하지 않고 오래된 IO를 차단하는 것이 좋습니다.
신호 사용하기 :
대기중인 스크립트 시작시 :
echo $$ >>~/WeAreStopped
kill -STOP $$
당신의 긴 일의 끝에서 :
if [[ -f ~/WeAreStopped ]] ; then
xargs kill -CONT < ~/WeAreStopped
rm ~/WeAreStopped
fi
일부 플래그를 사용하도록 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를 찾을 필요가 없으므로 조금 더 쉽습니다.
부모가 자식 프로세스 중 하나가 완료되기를 기다리는 것을 제외하고는 프로세스가 다른 프로세스가 완료되기를 기다리는 기능이 없습니다. 가능하면 스크립트를 통해 프로그램을 시작하십시오.
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
가능성 목록은 설명서를 참조하십시오 ).