スナップショットをオフサイトの場所に送信するバックアップスクリプトがあります。
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プロシージャを削除するのはなぜですか?