프로세스가 이미 존재하는 경우 cron에 앱을 실행하도록 명령 할 수있는 방법이 있습니까?
프로세스가 이미 존재하는 경우 cron에 앱을 실행하도록 명령 할 수있는 방법이 있습니까?
답변:
가장 간단한 방법은 pgrep을 사용하십시오.
crontab에서 :
* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1
export DISPLAY=:0
를 방지하기 위해 앞에 추가하십시오 Could not connect to display
. * * * * * export DISPLAY=:0 && pgrep processname > /dev/null || /path/to/processname -args0 -args1
프로그램을 직접 실행하는 대신 스크립트를 실행하십시오. 많은 가능성이 있습니다. 예를 들면 다음과 같습니다.
MYPROG="myprog"
RESTART="myprog params"
PGREP="/usr/bin/pgrep"
# find myprog pid
$PGREP ${MYPROG}
# if not running
if [ $? -ne 0 ]
then
$RESTART
fi
pgrep myprog; if [ $? -ne 0 ]; then ...
다음과 같이 작성하는 것이 좋습니다if ! pgrep myprog; then ...
$?
예를 들어 로그 메시지를 추가하거나 행 사이의 오류 처리 를 통해 실수로의 값을 쉽게 손상시킬 수 있습니다.
이전 인스턴스가 완료되지 않은 경우이 스크립트는 다시 실행되지 않습니다. 다른 특정 프로세스가 실행중인 경우 무언가를 실행하지 않으려면 harrymc의 스크립트를 참조하십시오.
DATE=`date +%c`;
ME=`basename "$0"`;
LCK="./${ME}.LCK";
exec 8>$LCK;
if flock -n -x 8; then
echo ""
echo "Starting your script..."
echo ""
[PUT YOUR STUFF HERE]
echo ""
echo "Script started $DATE";
echo "Script finished `date +%c`";
else
echo "Script NOT started - previous one still running at $DATE";
fi
*/5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
이것은 대개 프로그램이 아닌 프로그램 자체에서 처리합니다 cron
. 이를위한 두 가지 표준 기술이 있습니다.
1) 해당 이름의 프로세스가 이미 실행 중인지 확인 grep
하는 출력ps
2) 시작시, 먼저 pid (프로세스 ID) 파일 /var/run/program_name.pid
이 있는지 확인하고, 파일이 있으면 파일에서 pid를 읽고 해당 프로세스가 여전히 존재하는지 확인하십시오. 그렇다면 시작을 거부하십시오. pid 파일이 없거나 파일의 pid가 사라지면 pid 파일을 작성하고 프로세스 ID를 파일에 기록한 후 정상 시작을 계속하십시오.
기술적으로 이들 중 하나를 crontab에 직접 수행하는 bash 파이프를 작성하는 것이 가능하지만 시작중인 프로그램에 추가하거나 (시작 방법에 관계없이 적용 할 수 있도록) 래퍼 스크립트를 작성하는 것이 좋습니다. harrymc가 제안한대로 이것을 처리하십시오.
* * * * * pgrep -f "[p]attern" > /dev/null || /path/to/processname -args0 -args1
패턴 일치 개선으로 위의 답변을 재사용했습니다. f 옵션이없는 pgrep가 프로세스 패턴과 일치하지 않습니다. 그러나 f 옵션을 사용하는 데 문제가 있습니다. f 옵션을 사용하면 cron을 생성하는 쉘이 항상 일치하고 pid를 반환하므로 프로세스가 다시 시작되지 않습니다.
문자 패턴 중 하나 주위에 []를 추가하면 프로세스 만 일치하고 cron shell의 pid는 반환되지 않습니다.
문서 : https://www.timkay.com/solo/
solo는 프로그램이 한 번에 두 개 이상의 사본을 실행하지 못하게하는 매우 간단한 스크립트 (10 줄)입니다. cron에서는 이전 작업이 완료되기 전에 작업이 실행되지 않도록하는 것이 유용합니다.
예
* * * * * solo -port=3801 ./job.pl blah blah