プロセスがまだ実行されていない場合(バックグラウンドで)、特定のコマンドのみを実行するbashコマンドラインを作成できますか?
* commandがすでに実行されているかどうかを確認する方法は?
(その間に次のコマンドを追加して、&&
最初のコマンドがtrueの場合にのみ次のコマンドを実行することができます。)
*: テストする、決定する、発見する、発見する
答え1
答え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 comm
15文字に切り捨てられ、最初の15文字のみが一致します。pgrep
ps -C
ps -C
OS 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