サーバー上でスクリプトの単一インスタンスを実行し続けるために、次を使用しています。これを毎分実行するcronjobがあります。
UNIXで任意のスクリプトをデーモン化するにはどうすればよいですか?
#!/bin/bash
if [[ $# < 1 ]]; then
echo "Name of pid file not given."
exit
fi
# Get the pid file's name.
PIDFILE=$1
shift
if [[ $# < 1 ]]; then
echo "No command given."
exit
fi
echo "Checking pid in file $PIDFILE."
#Check to see if process running.
PID=$(cat $PIDFILE 2>/dev/null)
if [[ $? = 0 ]]; then
ps -p $PID >/dev/null 2>&1
if [[ $? = 0 ]]; then
echo "Command $1 already running."
exit
fi
fi
# Write our pid to file.
echo $$ >$PIDFILE
# Get command.
COMMAND=$1
shift
# Run command
$COMMAND "$*"
なんらかの理由でスクリプトがハングしたため、スタックしていることがわかりました。$PIDFILE
が「古い」かどうかを確認し、そうであればプロセスを強制終了する方法が必要です。それが可能であることは知っていますが(ファイルのタイムスタンプを確認してください)、構文がわかりません。また、これが良いアイデアであるかどうかもわかりません。また、このスクリプトの実行中は、CPU の使用率がかなり高くなります。ハングした場合 (まれですが、これまでに少なくとも 1 回発生しました)、CPU 使用率は 0% に低下します。プロセスが本当にハングアップしているか、アクティブでないかを確認できればいいのですが、それを行う簡単な方法があるかどうかはわかりません (そして、プロセスが強制終了される場所で多くの誤検知を発生させたくありませんが、元気に走っています)。