私は次のようにPHPファイルを実行しています。
nohup php server.php &
特定のポートをリッスンし、入力に従って操作を実行します。
問題は時々スクリプトが停止することです。私のサーバーは引き続きポートをリッスンしてサブプロセスを作成するため、cronジョブを使用してこの問題を解決することはできません。
server.php
実行中であることを確認し、そうでない場合は開始する方法はありますか?
答え1
check process を使用できますが、ps
欠点の1つは、実行中のプロセスのインスタンスが複数ある場合、またはスクリプトが中断された場合にこの方法が決定的ではない可能性があることです。
私は実際にサーバーがポートでリッスンしていることを確認することを好みます。これを行ういくつかの方法は次のとおりです。たとえば、サーバーがポート2000でリッスンしている場合は、次の点を考慮してください。
使用lsof
lsof -i :2000; echo $?;
lsof
開いているファイル記述子を調べており、プログラムがこのポートでリッスンしているのかアクティブに通信しているのかを確認する必要があります。0
サーバーがポート 2000 で接続を受け入れると a がエコーされ、1
そうでなければ a がエコーされます。
使用nc
nc -z -w1 192.168.1.12 2000 &> /dev/null; echo $?;
これはソケットサーバーをチェックするために私が好む方法です。ここでは、ゼロI / Oモードフラグをnc
使用してポートをすばやくスキャンします。-z
ここでは、IPアドレスと正しいポートを使用できます。サーバーが接続を受け入れると、生活は良いです。
ここでも戻り値は0
良いか1
悪いです。我々は単に高速ブールチェックをしたいので、ここではすべての出力を削除します。ネットワークアドレスにアクセスできる場合、このメソッドは非常に迅速に返されます。サーバー自体で実行すると、自己通信しようとしたときに遅延がほとんど発生しません。
オートメーション
cron でこれらのテストを実行するには、bash スクリプトを生成し、コマンドの一方または両方を実行し、一連の論理チェックを実行します。失敗した場合は、スクリプトを再起動して再確認してください。私はこのような方法を数年間使用してきましたが、実際の稼働時間の点で非常に良い結果が得られました。
答え2
パーティーに少し遅れました..
再起動されたデーモンを使用すると、プログラムとbashスクリプトを実行できます。 Restartdは、リスト内のプログラムが実行されているかどうかを20秒ごとに(設定可能)チェックします。
マニュアルページをご覧くださいここ
答え3
これがXYの問題を解決するかどうかはわかりません。
if ps -C php -o args h | grep -q server.php
then true ## php server.php running
else php server.php ## not running
fi
メモ
-C php
PHPインスタンスを検索します。-o args
完全なコマンドラインが表示されます。h
タイトルなし
grep
-q
静かな
プログラムがphp server.php
実行中であることを確認し、プログラムが停止すると、プロセスはここにあり、再起動されません。
実際の解決策は、どんな接続があってもserver.phpをポーリングして、タイムアウトなしに知っている答えを得ることを期待することです。失敗した場合は再起動してください。