flock
を使用 .それは新しい。それは良いです。
これで、自分でコードを書く必要がなくなりました。ここでその他の理由を確認してください:https://serverfault.com/a/82863
/usr/bin/flock -n /tmp/my.lockfile /usr/local/bin/my_script
私が書いた印刷スプーラ プログラムに対してこれを行います。これは単なるシェル スクリプトです:
#!/bin/sh
if ps -ef | grep -v grep | grep doctype.php ; then
exit 0
else
/home/user/bin/doctype.php >> /home/user/bin/spooler.log &
#mailing program
/home/user/bin/simplemail.php "Print spooler was not running... Restarted."
exit 0
fi
2 分ごとに実行され、非常に効果的です。何らかの理由でプロセスが実行されていない場合、特別な情報をメールで送信するようにしています。
他の人が述べているように、PID ファイルの書き込みとチェックは良い解決策です。これが私の bash 実装です:
#!/bin/bash
mkdir -p "$HOME/tmp"
PIDFILE="$HOME/tmp/myprogram.pid"
if [ -e "${PIDFILE}" ] && (ps -u $(whoami) -opid= |
grep -P "^\s*$(cat ${PIDFILE})$" &> /dev/null); then
echo "Already running."
exit 99
fi
/path/to/myprogram > $HOME/tmp/myprogram.log &
echo $! > "${PIDFILE}"
chmod 644 "${PIDFILE}"