cron : 프로세스를 실행하지만 실행 중이 아닌 경우에만 실행합니까?


11

프로세스가 이미 존재하는 경우 cron에 앱을 실행하도록 명령 할 수있는 방법이 있습니까?

linux  cron 

앱이 이미 실행중인 경우 또는 다른 프로세스가 이미 실행중인 경우 앱을 실행하지 않아야하는지 여부를 확인 하시겠습니까? 감사합니다
Linker3000

답변:


23

가장 간단한 방법은 pgrep을 사용하십시오.

crontab에서 :

* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1

이 답변의 단순성을 좋아하십시오. 참고로, pgrep에 -f 플래그를 추가 할 수 있어야하며 전체 프로세스 이름을 확인할 수 있습니다. 이는 프로세스의 인수를 조건의 일부로 검사하려는 경우에도 유용합니다.
Craig Sefton

6
아니요, cronjob 내에서 pgrep와 함께 -f 플래그를 사용할 수 없습니다. 그 이유는 cronjob 자체를 실행하는 데 사용되는 쉘 스크립트와 일치하기 때문입니다.
CpnCrunch

cron으로 GUI 프로세스를 실행할 때 오류 export DISPLAY=:0를 방지하기 위해 앞에 추가하십시오 Could not connect to display. * * * * * export DISPLAY=:0 && pgrep processname > /dev/null || /path/to/processname -args0 -args1
Benjam

9

프로그램을 직접 실행하는 대신 스크립트를 실행하십시오. 많은 가능성이 있습니다. 예를 들면 다음과 같습니다.

MYPROG="myprog"
RESTART="myprog params"
PGREP="/usr/bin/pgrep"
# find myprog pid
$PGREP ${MYPROG}
# if not running
if [ $? -ne 0 ]
then
   $RESTART
fi

1
참고-스칼라 변수를 사용하여 인수 목록을 저장하는 것은 나쁜 습관으로 간주됩니다. 실패한 경우의 예는 mywiki.wooledge.org/BashFAQ/050 을 참조하십시오 .
찰스 더피

... 유사하게 pgrep myprog; if [ $? -ne 0 ]; then ...다음과 같이 작성하는 것이 좋습니다if ! pgrep myprog; then ...
Charles Duffy

...이 후자의 스타일은 가독성이 높을뿐만 아니라 오류가 적은 경향이 있습니다. $?예를 들어 로그 메시지를 추가하거나 행 사이의 오류 처리 를 통해 실수로의 값을 쉽게 손상시킬 수 있습니다.
Charles Duffy

7

이전 인스턴스가 완료되지 않은 경우이 스크립트는 다시 실행되지 않습니다. 다른 특정 프로세스가 실행중인 경우 무언가를 실행하지 않으려면 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

3

스크립트에서 잠금 파일을 사용할 수 있지만 프로세스 관리 를 참조하십시오 .

flock 사용할 수있는 유틸리티 중 하나입니다.


좋은 것! 이제이 느린 회선을 통한 rsync는 수동 개입없이 클라이언트 호스트가 온라인으로 연결된 후 5 분 이내에 시작하여 필요한 시간을 모두 소요 할 수 있습니다.*/5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
eMPee584

1

이것은 대개 프로그램이 아닌 프로그램 자체에서 처리합니다 cron. 이를위한 두 가지 표준 기술이 있습니다.

1) 해당 이름의 프로세스가 이미 실행 중인지 확인 grep하는 출력ps

2) 시작시, 먼저 pid (프로세스 ID) 파일 /var/run/program_name.pid이 있는지 확인하고, 파일이 있으면 파일에서 pid를 읽고 해당 프로세스가 여전히 존재하는지 확인하십시오. 그렇다면 시작을 거부하십시오. pid 파일이 없거나 파일의 pid가 사라지면 pid 파일을 작성하고 프로세스 ID를 파일에 기록한 후 정상 시작을 계속하십시오.

기술적으로 이들 중 하나를 crontab에 직접 수행하는 bash 파이프를 작성하는 것이 가능하지만 시작중인 프로그램에 추가하거나 (시작 방법에 관계없이 적용 할 수 있도록) 래퍼 스크립트를 작성하는 것이 좋습니다. harrymc가 제안한대로 이것을 처리하십시오.


0

* * * * * pgrep -f "[p]attern" > /dev/null || /path/to/processname -args0 -args1

패턴 일치 개선으로 위의 답변을 재사용했습니다. f 옵션이없는 pgrep가 프로세스 패턴과 일치하지 않습니다. 그러나 f 옵션을 사용하는 데 문제가 있습니다. f 옵션을 사용하면 cron을 생성하는 쉘이 항상 일치하고 pid를 반환하므로 프로세스가 다시 시작되지 않습니다.

문자 패턴 중 하나 주위에 []를 추가하면 프로세스 만 일치하고 cron shell의 pid는 반환되지 않습니다.


0

문서 : https://www.timkay.com/solo/

solo는 프로그램이 한 번에 두 개 이상의 사본을 실행하지 못하게하는 매우 간단한 스크립트 (10 줄)입니다. cron에서는 이전 작업이 완료되기 전에 작업이 실행되지 않도록하는 것이 유용합니다.

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