プログラムを実行する方法の正確な1つのインスタンスです。または、特定の実行プログラムをテストする方法

プログラムを実行する方法の正確な1つのインスタンスです。または、特定の実行プログラムをテストする方法

プログラムの1つのインスタンスをプロセスとして実行するには?または、実行中のプログラムが存在するかどうかをテストする方法は?

ポータブル方法が好ましい。

ベストアンサー1

(名前付き)パイプの書き込み可能性をテストし、適切なプログラミングを使用して実行中のプログラムインスタンスの存在をテストできます。

ファイル名を/tmp/fifo-myappFIFOファイルの名前で予約するとします(それぞれのアプリケーション用にカスタマイズする必要があり、通常は一部のアプリケーション固有のフォルダにあり、絶対パスで指定されています)。

ファイル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は決して動作しません。信号を送信しました。

おすすめ記事