web-dev-qa-db-ja.com

実行中の場合はプロセスIDを返し、実行されていない場合は他の出力を返すコマンド?

PIDを取得するコマンドを探していますが、実行されていない場合は、空白以外の出力が表示されるはずです。

私のプログラムでは、そのプロセスが実行されていても、使用しているライブラリが空白の出力を提供することがあり、空白の出力がlibrayによるものなのか、プロセスの停止によるものなのかを検出できません。

ライブラリ呼び出しの変更には時間がかかるので、回避策などのシェルコマンドの提案を探していますか?

1
solarisguest

PIDの検索

名前に基づいてプロセスを検索するためのps以外のツールがあります。

$ pgrep name

$ sleep 100 &
[1] 2556

$ pgrep sleep
2556

上記では、sleepという名前のプロセスが開始されてからバックグラウンドで処理されていることがわかります。 pgrepを使用してその名前のプロセスを検索すると、そのPIDが返されます。

ステータスの確認

出力が空白であるという質問について。コマンドが返されると、多くの場合、BashなどのBourneシェルの$?という特別な変数に格納されるステータスコードが返されます。したがって、この変数の内容を調べて、探しているプロセス名が存在するかどうかを確認する必要があります。

sleepを再度使用した同様の例。

$ sleep 100 &
[1] 3228

sleepという名前のプロセスのPIDを探します。

$ pgrep sleep
3228

ステータス変数$?を確認します。ゼロは、正常に実行され、探しているものが見つかったことを意味します。

$ echo $?
0

ここで、sleepyという名前の偽のプロセスを探します。

$ pgrep sleepy

出力が得られないだけでなく、status変数に出力が含まれています。これは、実行したコマンドが探しているものを見つけるのに失敗したことを示しています。

$ echo $?
1
1
slm

次のようにコマンドを組み合わせることができます。

ps <pid> || echo "message"

Pidが存在する場合は、pidを取得します。存在しない場合は、メッセージが出力されます。

1
mkc

別の角度から質問を攻撃します。答えpgrep <some string>は本当にあなたの最後の選択でなければなりません。その理由を説明させてください。

どのUnix/Linux OSでも、そのプロセスのPIDがない限り、「プロセス」が実行されているかどうかを予測する方法はありません。プロセスのargベクトルでの文字列パターンマッチングに基づくすべてのメソッドは、遅かれ早かれ失敗する運命にあります。例:あなたはそれを考えるかもしれません例えばpgrep mysqldは、MySQLデータベースが実行されているかどうかを把握するために必要なものですが、誰かがそのホストでMySQLの2番目のインスタンスを開始した日に失敗します。これは完全に合法的なアクションです。

プロセスを見つけるときに文字列パターンマッチングを使用する際の問題のため、ほとんどすべての「プロフェッショナル」スクリプトがpidfileメソッドを使用することがあります。つまり、プロセス時にPIDがファイルに保存されるようにします。が開始されます。問題は、「PIDが実行されているかどうかを確認する方法」になります。通常はps -p xxxx -o pid=を実行します。これは、プロセスが実行されている場合はPID自体を返し、それ以外の場合は何も返しません。このコマンドの利点は、Linux/Solaris/BSD間で移植できることです。

繰り返しますが、チェックスクリプトでpgrep nameのようなものに頼る必要がある場合は、プロセスを開始したときに何か間違ったことをしました。 pgrep nameは最後に試すオプションであり、実際には、プロセスの開始方法を制御しない場合にのみ関係します。また、Unix/Linuxにはプロセスの名前の概念があると思わせるようなインターネット上のブログ投稿にだまされないでください。 Unix/Linuxには、プロセスの名前のようなものはなく、少なくともリモートで一意のものさえありません。あったらいいのですが、ありません。 のみ特定のプロセスに固有のものはPIDです。

0
unixhacker2010