cron 작업이 아직 실행되고 있지 않은 경우에만 실행하십시오.
그래서 나는 내가 만든 데몬에 대한 금지 감시자로 cron 작업을 설정합니다. 데몬이 실패하고 실패하면 cron 작업이 주기적으로 다시 시작하기를 원합니다 ...이 방법이 확실하지 않지만 몇 가지 cron 안내를 읽습니다. 찾고 있어요 ...
내 데몬은 쉘 펼쳐에서 시작이 아직 실행되고 해당 작업의 이전 실행이 실행되고 있지 않은 경우에만 cron 작업을 실행하는 방법을 찾고 있습니다.
잠금 파일을 사용하여 수행하려는 작업에 대한 솔루션을 제공하는 이 게시물을 찾았습니다 . 더 나은 방법이 확실하지 않습니다 ...
당신의 도움을 주셔서 감사합니다.
필자가 인쇄 인쇄 스풀러 프로그램을 위해 작업을 수행합니다. 쉘 펼쳐 일뿐입니다.
#!/bin/sh
if ps -ef | grep -v grep | grep doctype.php ; then
exit 0
else
/home/user/bin/doctype.php >> /home/user/bin/spooler.log &
#mailing program
/home/user/bin/simplemail.php "Print spooler was not running... Restarted."
exit 0
fi
2 분마다 실행 가능합니다. 어떤 경우에는 프로세스가 실행되고 있지 않은 경우 특별 정보가 발송됩니다.
사용하십시오 flock
. 이 새롭다. 더 좋습니다.
이제 코드를 직접 필요가 없습니다. https://serverfault.com/a/82863 에서 더 많은 이유를 확인하십시오.
/usr/bin/flock -n /tmp/my.lockfile /usr/local/bin/my_script
다른 사람들이 언급했듯이 PID 파일을 작성하고 확인하는 것이 좋습니다. 내 배쉬 구현은 다음과 가변합니다.
#!/bin/bash
mkdir -p "$HOME/tmp"
PIDFILE="$HOME/tmp/myprogram.pid"
if [ -e "${PIDFILE}" ] && (ps -u $(whoami) -opid= |
grep -P "^\s*$(cat ${PIDFILE})$" &> /dev/null); then
echo "Already running."
exit 99
fi
/path/to/myprogram > $HOME/tmp/myprogram.log &
echo $! > "${PIDFILE}"
chmod 644 "${PIDFILE}"
cron을 통해 시도하지 않습니다. cron이 무엇이든 상관없이 펼쳐지는 실행 한 다음 펼쳐지는 프로그램이 실행 중인지 결정하고 필요한 경우 시작하십시오 (Ruby 또는 Python 또는 선호하는 스크립팅 언어를 사용하여이를 수행 할 수 있음)
아무도 run-one 에 대해 언급하지 않은 것은 놀랍습니다 . 나는 이것으로 내 문제를 해결했다.
apt-get install run-one
그런 다음 run-one
crontab 연장 추가 .
*/20 * * * * * run-one python /script/to/run/awesome.py
이 askubuntu SE 답변을 확인하십시오 . 자세한 정보에 대한 링크도 설치 가능합니다.
crontab에서 직접 하나의 라이너로 수행 할 수도 있습니다.
* * * * * [ `ps -ef|grep -v grep|grep <command>` -eq 0 ] && <command>
Earlz의 답변으로 $ PID.running 파일이 시작될 때 작성하고 종료 할 때 삭제하는 래퍼 펼쳐야합니다. 랩퍼 펼쳐는 실행하려는 하려는를 호출합니다. 대상 펼쳐가 실패하거나 발생하면 pid 파일이 삭제됩니다.
PHP 확장을 사용할 때 내가하는 방식은 다음과 같습니다.
크론 탭 :
* * * * * php /path/to/php/script.php &
PHP 코드 :
<?php
if (shell_exec('ps aux | grep ' . __FILE__ . ' | wc -l') > 1) {
exit('already running...');
}
// do stuff
이 명령은 시스템 프로세스 목록에서 현재 PHP 파일 이름을 찾으면 행 카운터 (wc -l)가 하나보다 먹습니다.
따라서 php crons를 실행하는 경우 위 코드를 php 코드 시작 부분에 추가하면 한 번만 실행됩니다.
monit 과 같은 기존 도구를 사용하는 것이 좋습니다 . 프로세스를 모니터링하고 자동으로 다시 시작합니다. 가능한 자세한 정보가 여기가 . 대부분의 배포판에서 쉽게 사용할 수 있어야합니다.
함께 lockrun
하면 당신의 cron 작업에 대한 래퍼 스크립트를 작성할 필요가 없습니다. http://www.unixwiz.net/tools/lockrun.html
이것은 결코 나를 실패하지 않았습니다.
one.sh :
LFILE=/tmp/one-`echo "$@" | md5sum | cut -d\ -f1`.pid
if [ -e ${LFILE} ] && kill -0 `cat ${LFILE}`; then
exit
fi
trap "rm -f ${LFILE}; exit" INT TERM EXIT
echo $$ > ${LFILE}
$@
rm -f ${LFILE}
크론 작업 :
* * * * * /path/to/one.sh <command>
rsanden의 답변에 대한 개선으로 다음을 제안합니다 (댓글로 게시하지만 평판이 충분하지 않습니다 ...).
#!/usr/bin/env bash
PIDFILE="$HOME/tmp/myprogram.pid"
if [ -e "${PIDFILE}" ] && (ps -p $(cat ${PIDFILE}) > /dev/null); then
echo "Already running."
exit 99
fi
/path/to/myprogram
이는 가능한 잘못된 일치 (및 grepping의 오버 헤드)를 방지하고 출력을 억제하고 ps의 종료 상태에만 의존합니다.
간단한 사용자 정의 PHP로 충분합니다. 쉘 스크립트와 혼동 할 필요가 없습니다.
실행 하지 않는 경우 php /home/mypath/example.php 를 실행한다고 가정합니다.
그런 다음 다음 사용자 정의 PHP 스크립트를 사용하여 동일한 작업을 수행하십시오.
다음 /home/mypath/forever.php 생성
<?php
$cmd = $argv[1];
$grep = "ps -ef | grep '".$cmd."'";
exec($grep,$out);
if(count($out)<5){
$cmd .= ' > /dev/null 2>/dev/null &';
exec($cmd,$out);
print_r($out);
}
?>
그런 다음 크론에 다음을 추가하십시오.
* * * * * php /home/mypath/forever.php 'php /home/mypath/example.php'
# one instance only (works unless your cmd has 'grep' in it)
ALREADY_RUNNING_EXIT_STATUS=0
bn=`basename $0`
proc=`ps -ef | grep -v grep | grep "$bn" | grep -v " $$ "`
[ $? -eq 0 ] && {
pid=`echo $proc | awk '{print $2}'`
echo "$bn already running with pid $pid"
exit $ALREADY_RUNNING_EXIT_STATUS
}
해당 경로로 이동하려는 경우 grep을 통해 파이프 된 ps 대신 pgrep (사용 가능한 경우)를 사용하는 것이 좋습니다. 개인적으로 저는 스크립트 형식에서 많은 마일리지를 얻었습니다.
while(1){
call scriptthat_must_run
sleep 5
}
이것이 실패 할 수 있지만 cron 작업 은 종종 필수 항목에 가장 적합한 방법입니다. 또 다른 대안.
참고 URL : https://stackoverflow.com/questions/2366693/run-cron-job-only-if-it-isnt-already-running
'IT' 카테고리의 다른 글
UINavigationBar에 버튼을 추가하는 방법? (0) | 2020.07.21 |
---|---|
클릭 후 알림 제거 (0) | 2020.07.21 |
GUID 충돌이 가능합니까? (0) | 2020.07.21 |
응용 프로그램을 릴리스하기 전에 NSLog를해야하고 전에? (0) | 2020.07.21 |
iOS (iPhone, iPad, iPodTouch) 실시간 콘솔 로그 터미널보기 (0) | 2020.07.21 |