プログラムのシングルトン実行インスタンスを確保するために、pidファイルを使用するためにプロセスがプログラムを実行した後にpidファイルを削除する必要があると思いました。https://stackoverflow.com/a/7453411/156458:
#!/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}"
これは次のように機能します。スクリプトは最初にPIDファイルが存在するかどうかを
[ -e "${PIDFILE}" ]
確認します。存在しない場合は、バックグラウンドでプログラムを起動し、そのPIDをファイル( "echo $! > "${PIDFILE}"
")に書き込んで終了します。代わりにPIDファイルが存在する場合、スクリプトは自分のプロセス( "ps -u $(whoami) -opid=
")を確認し、同じPID(" ")で実行されているプロセスがあることを確認します。grep -P "^\s*$(cat ${PIDFILE})$"
それ以外の場合は、以前のようにプログラムを起動して上書きします。新しいファイルでPIDを確認して終了します。スクリプトを変更する理由はありません。
上記のスクリプトではpidがリサイクルされていないと仮定していますか?
あるプロセスがプログラムの実行を完了した後、別のプログラムを実行する新しいプロセスでそのpidを再利用することはありますか?この場合、参照されたスクリプトはプロセスがプログラムを実行していると誤って考えます。
ありがとうございます。