Cronはスクリプトを2回起動します。

Cronはスクリプトを2回起動します。

スナップショットをオフサイトの場所に送信するバックアップスクリプトがあります。

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

何らかの理由で、私のPIDファイルはスクリプトフォームの2回目の実行を停止する必要がありますが、cronでは機能しません。 2つのシェルを開き、スクリプトを2回起動すると、すべてが期待どおりに機能します。

#!/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プロシージャを削除するのはなぜですか?

関連情報