2014-03-24 5 views
1

좋아요, 그래서 저는 postgres 데이터베이스를 검사하는 무한 루프가있는 스크립트를 가지고 있습니다. 그건 잘 작동합니다. 프로세스가 계속 실행되도록하기 위해 cron을 사용하여 모든 minuet 파일을 계속 실행합니다. 이것의 여러 인스턴스를 멈추기 위해이 PID 체크 스크립트를 작성했습니다. 내가 ./script.sh와 프로세스를 실행하면crontab을 실행할 때 PID 검사기가 작동하지 않습니다.

SCRIPTNAME=`basename $0` 
PIDFILE="/var/run/${SCRIPTNAME}.pid" 

if [ -e ${PIDFILE} ]; then 
    PID=`cat ${PIDFILE}`; 

    echo "Found PID ${PID}" 

    RUNNING=`ps -p ${PID} -o pid=` 
    if [ ${RUNNING} -eq ${PID} ]; then 
     RUNNINGNAME=`ps -p ${PID} -o command=` 
     if [ `echo "${RUNNINGNAME}" | grep -c *${SCRIPTNAME}*` -eq "1" ]; then 
      echo "${SCRIPTNAME} is already running." 
      exit 1 
     else 
      echo "Wrong PID file." 
     fi 
    else 
     echo "Outdated PID file." 
    fi 
else 
    echo "No PID file." 
fi 
echo $$ > ${PIDFILE} 

그것은 나 다른 명령 줄에서 다른 인스턴스를 실행할 수 있도록하지 않습니다. 하지만 문제는 내가 cron에서 초기화 할 때 내 pid 검사에 관계없이 겉보기에 여러 인스턴스를 생성한다는 것입니다. 어떤 도움이라도 대단히 감사 할 것입니다. 단순히 코드

if [ echo "${RUNNINGNAME}" | grep -c *${SCRIPTNAME}* -eq "1" ]; then
echo "${SCRIPTNAME} is already running." exit 1 fi

의 부분을 제거하고 나는 그것이 작동시킬 수 있었다 간단한 exit 1로 교체하여

+0

cron이 실행되는 환경에서 cat/echo/ps/grep을 찾을 수있는 적절한 'PATH' 변수가 있는지 확실합니까? 스크립트의 시작 부분에'#!/bin/bash'가 있습니까? 그러면 올바른 인터프리터를 실행하고 있는지 확신 할 수 있습니까? – Sammitch

+0

+1, 좋은 첫 번째 질문. 'set -vx'로 디버깅/트레이스를 켜고'59 23 24 03 * /path/to/MyProg.sh> /tmp/myProg.Trace 2> & 1'와 같은 crontab cmd 라인의 모든 출력을 리다이렉트하는 것은 어떨까요? 행운을 빌어 요. – shellter

+0

도움을 주셔서 감사합니다. if 문을 없애 버렸다. if [echo "$ {RUNNINGNAME}"| grep -c * $ {SCRIPTNAME} * -eq "1"]; "$ {SCRIPTNAME}이 (가) 이미 실행 중입니다." exit 1'을 실행하고 저장된 pid가 실행중인 pid와 일치하면 1을 종료하도록 지시했습니다. 죄송합니다. 시간 낭비했습니다. – user3457244

답변

0

.

어떤 이유로 cron은 스크립트의이 부분을 좋아하지 않습니다. 수동으로 실행하는 경우 스크립트가 실제로 저장된 pid에서 실행되는 스크립트 인 경우 도움이되므로이 값을 유지하는 것이 좋습니다. 이것은 약간의 기회이며 일반적으로 사용자 오류로 인해 발생하지만이 가능성을 고려한 구축은 좋은 아이디어입니다.

나는 이것이 왜 cron에서 깨지는 지 아직 확신 할 수 없다.

관련 문제