プログラムの1つのインスタンスをプロセスとして実行するには?または、実行中のプログラムが存在するかどうかをテストする方法は?
ポータブル方法が好ましい。
ベストアンサー1
(名前付き)パイプの書き込み可能性をテストし、適切なプログラミングを使用して実行中のプログラムインスタンスの存在をテストできます。
ファイル名を/tmp/fifo-myapp
FIFOファイルの名前で予約するとします(それぞれのアプリケーション用にカスタマイズする必要があり、通常は一部のアプリケーション固有のフォルダにあり、絶対パスで指定されています)。
ファイル1:test-wr-fifo
#!/bin/sh
# invocation: test-wr-fifo <timeout>
timeout="${1:=3}"
if ! [ -p "/tmp/fifo-myapp" ] ; then
rm -f "/tmp/fifo-myapp"
mkfifo "/tmp/fifo-myapp"
fi
{ sleep "$timeout" ; kill -s 0 $$ && kill -s TERM $$ ; } &
exec 3>"/tmp/fifo-myapp"
fifo が開いておらず、指定されたタイムアウトに達すると、プログラムは障害状態で終了します。
ファイル2:single-inst-prog
#!/bin/sh
exec 3<"/tmp/fifo-myapp"
### Application Code ###
これはインスタンスが1つだけ必要なプログラムです。
移動するsingle-inst-prog
:
./test-wr-fifo || ./single-inst-prog &
これは、FIFOブロックの一方の端を開くまで(O_NONBLOCKがクリアされた場合)、もう一方の端も開くために機能します。 FIFOからデータを読み書きしないために動作するため、EOF条件とSIGPIPEは決して動作しません。信号を送信しました。