Cron은 스크립트를 두 번 시작합니다.

Cron은 스크립트를 두 번 시작합니다.

스냅샷을 오프사이트 위치로 보내는 백업 스크립트가 있습니다.

0 0 * * * /root/backup/backup_incremental >> /root/backup/test.log

어떤 이유로 내 PID 파일은 스크립트 양식의 두 번째 실행을 중지해야 하지만 cron에서는 작동하지 않습니다. 두 개의 셸을 열고 스크립트를 두 번 시작하면 모든 것이 예상대로 작동합니다.

#!/usr/local/bin/zsh

PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin 
DATE=`date "+%Y-%m-%d_%H-%M-%S"` 

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


if [ -f ${PIDFILE} ]; then
       #verify if the process is actually still running under this pid
         OLDPID=`cat ${PIDFILE}`
         RESULT=`ps -ef | grep ${OLDPID} | grep ${SCRIPTNAME}`  

         if [ -n "${RESULT}" ]; then
             echo "${DATE}: Script already running (PID: ${OLDPID})! Exiting"
             exit 255
         fi

fi

#grab pid of this process and update the pid file with it
PID=`ps -ef | grep ${SCRIPTNAME} | head -n1 | awk ' {print $2;} '`
echo ${PID} > ${PIDFILE}

#send it
....


if [ -f ${PIDFILE} ]; then
    rm ${PIDFILE}
fi

중요한 부분만 제거한 내 스크립트는 다음과 같습니다.

그래서 내 질문은 cron이 이것을 여러 번 시작하는 방법입니다.

답변1

PID=`ps -ef | grep ${SCRIPTNAME} | head -n1 | awk ' {print $2;} '`

이는 스크립트의 PID, 프로세스의 PID grep또는 비슷한 이름을 가진 관련 없는 프로세스의 PID를 반환할 수 있습니다. 이것이 아마도 문제의 원인일 것입니다. 때로는 스크립트가 자체 PID를 pidfile에 쓰고 때로는 다른 것을 쓰기도 합니다.

스크립트의 PID는 변수에 있습니다 $$.

특정 프로세스 이름의 PID를 실제로 찾아야 하는 경우에는 다음을 참조하세요.프로세스 ID를 찾아 종료합니다.그리고grep - grep 패턴의 괄호가 ps 결과에서 grep 절차를 제거하는 이유는 무엇입니까?

관련 정보