좋아요, 그래서 저는 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
로 교체하여
cron이 실행되는 환경에서 cat/echo/ps/grep을 찾을 수있는 적절한 'PATH' 변수가 있는지 확실합니까? 스크립트의 시작 부분에'#!/bin/bash'가 있습니까? 그러면 올바른 인터프리터를 실행하고 있는지 확신 할 수 있습니까? – Sammitch
+1, 좋은 첫 번째 질문. 'set -vx'로 디버깅/트레이스를 켜고'59 23 24 03 * /path/to/MyProg.sh> /tmp/myProg.Trace 2> & 1'와 같은 crontab cmd 라인의 모든 출력을 리다이렉트하는 것은 어떨까요? 행운을 빌어 요. – shellter
도움을 주셔서 감사합니다. if 문을 없애 버렸다. if [echo "$ {RUNNINGNAME}"| grep -c * $ {SCRIPTNAME} * -eq "1"]; "$ {SCRIPTNAME}이 (가) 이미 실행 중입니다." exit 1'을 실행하고 저장된 pid가 실행중인 pid와 일치하면 1을 종료하도록 지시했습니다. 죄송합니다. 시간 낭비했습니다. – user3457244