プロセスがすでにバックグラウンドで実行されていることを確認するBash方法(およびそれに応じて再実行をスキップする)は何ですか?

プロセスがすでにバックグラウンドで実行されていることを確認するBash方法(およびそれに応じて再実行をスキップする)は何ですか?

プロセスがまだ実行されていない場合(バックグラウンドで)、特定のコマンドのみを実行するbashコマンドラインを作成できますか?

* commandがすでに実行されているかどうかを確認する方法は?

(その間に次のコマンドを追加して、&&最初のコマンドがtrueの場合にのみ次のコマンドを実行することができます。)

*: テストする、決定する、発見する、発見する

答え1

使用デーモンツール。あなたはそれを使用することができますsvokサービス/デーモン/バックグラウンドプロセスが現在実行中であることを確認してください。

その他の方法については、次をご覧ください。

答え2

私は時々次の技術を使用します。

$ pgrep <process name> || <process name>

以前は、pgrep次のようにしていました。

$ ps -eaf | grep -q <[p]rocess name> || <process name>

はい

ビットが所定の位置にある場合、[p]あなたはgrepそれから抜け出すことはできません。

$ ps -eaf | grep -q [s]leep || sleep 10

答え3

同じプロセスの複数のインスタンスを独立して実行できるため、これは難しい場合があります。たとえば、別のポートでリッスンするサーバーまたは他のユーザーとして実行されるサービスです。これらのインスタンスを区別するには、各インスタンスに一意のラベルを割り当てる必要があります。タグは通常ファイルですが、抽象名前空間のローカルソケット、TCPポートなどです。すべての一意の識別子が可能です。タグがファイルの場合は、プロセスID(pidfile)を含む通常のファイル、またはファイルが待機している名前付きパイプまたはソケットなどです。理想的には、タグはクライアントがそのプロセスに接続できるようにする通信エンドポイントです。

各タイプのタグは、探しているインスタンスが実行されていることを確認するために異なる方法でチェックします。たとえば、ローカルファイルソケットを使用して接続を試み、ソケットでリッスンしているプロセスがない場合は、プロセスを開始します。タグがpidfileの場合は、そのプロセスIDを持つプロセスが存在することを確認してください。ただし、プロセスが終了すると、そのIDを再利用する無関係なプロセスがある可能性があるため、これは脆弱であることに注意してください。両方のクライアントが短時間でプロセスにアクセスしようとすると、どちらもプロセスが存在しないことを発見して開始しようとします。これらの競合状態を正しく防止するのは難しいかもしれません。

同じスーパーバイザプロセスによってインスタンスがすべて起動されると、インスタンス管理が容易になり、スーパーバイザプロセスはインスタンスが終了する時点を検出し、それに応じて対応します。各種サービス監視プログラムこれは可能です。

プログラムが既知の通信エンドポイントから応答せず、ハイパーバイザーによって管理されていない場合、貧しい人々のラベルはpidfile、つまりプロセスIDを含むファイルです。プロセスが開始されると、pidはあらかじめ指定された名前でファイルに書き込まれます。存在するプロセスが必要な場合は、pidファイルを読み、そのpidを持つプロセスが存在することを確認してください。プロセスを終了したら、pidfileを削除します。管理されていないpidfileの最も顕著な問題は、プロセスが終了すると、関連していない一部のプロセスでそのpidを再利用できることです。少なくともプロセス名またはプロセス実行可能ファイルを確認して、正しいプロセスと通信していることを確認する必要があります。多くのUNIXバリアントでは正規表現コマンド:pgrep SOMENAME名前にSOMENAMEがサブストリングとして含まれるプロセスをリストし、特定のユーザーに制限し、正確な一致を要求し、「プロセス名」のいくつかの考えられる概念のどれを使用するかを変更するなどの追加オプション提供します。

答え4

その他のオプション:

  • pgrep -xq processname
    • GNU / Linuxでは、最初の15文字のみが一致します。
    • OS Xの祖先は含まれていません。
  • ps -eo comm= | sed 's|.*/||' | grep -xq processname
    • GNU / Linuxでは、最初の15文字のみが一致します。
    • sed 's|.*/||'OS Xでディレクトリ名部分を削除する

GNU / Linuxでは、コマンド名はps -o comm15文字に切り捨てられ、最初の15文字のみが一致します。pgrepps -C

ps -COS Xではサポートされていません(コマンド名と一致)。

ps -o commコマンドの絶対パスとOS Xのps -co commコマンド名のみを印刷します。 GNUでは、ps -o commコマンド名のみが印刷され、-c異なる意味を持ちます。

OS Xのpgrepにはこれは含まれていません-a。 GNUのpgrepにはデフォルトでこれが含まれていますが、サポートしていません-a

grep -x暗黙的ではpgrep -xないため、プロセス名に正規表現文字を含めることができる場合に使用されます-F-Fx

関連情報