シェルスクリプトで最後に実行されたコマンドのpidを取得するにはどうすればよいですか?

次のようなシェルスクリプトが必要です:

my-app & echo $my-app-pid 

しかし、実行したばかりのコマンドのpidを取得する方法がわかりません。

jobs -p my-appコマンドを使用してpidをgrepできることはわかっています。しかし、シェルを複数回実行したい場合、このメソッドは機能しません。 jobspec があいまいだからです。

回答

最後に実行されたコマンドのPIDは $! シェル変数:

my-app & echo $! 

コメント

  • たとえば、pidを出力しています。 [1] 893。番号だけが必要です。
  • これは、バックグラウンドで開始されるプログラムを表すことに注意してください。バックグラウンドプロセスが開始されていない場合、パラメータは設定されていません。
  • (回答へのコメント) pidを取得する方法で別の価値のある解決策が提案されています。開始したばかりのプロセスの例:ああ、" oneliner ":/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' & – sysfault 11月24日' 10 at 14:28
  • @ user3153014 String s like " [2] 2625 "は、バックグラウンドタスクの開始後にシェルによって出力されます。これは、echo $!
  • の出力とは関係ありません。

  • プロセスが終了するまで待つ必要がある場合、通常、スクリプトでこのようなコードを使用します。 my-app & myVar=$! ; fgfgは、プロセスを再びフォアグラウンドにします。その後、後でecho $myVarを印刷でき、' my-appがすでに終了していることを確信しています。

回答

PIDを取得:

#!/bin/bash my-app & echo $! 

PIDを変数に保存します:

#!/bin/bash my-app & export APP_PID=$! 

すべてのインスタンスを保存します:

#!/bin/bash my-app & echo $! >>/tmp/my-app.pid 

出力、エラー、およびPIDを別々のファイルに保存します:

#!/bin/bash my-app >/tmp/my-app.log 2>/tmp/my-app.error.log & echo $! >>/tmp/my-app.pid echo "my-app PID"s: $(cat /tmp/my-app.pid)" 

コメント

  • 質問はありませんでした'リダイレクトについて尋ねると、my-appのインスタンスが終了し、さらに悪いことにそのPIDが後で再利用されることを除いて、あなたの答えは受け入れられたものとほとんど同じです。'ファイルに不正な情報が含まれています。 'この回答が既存の受け入れられた回答に実際に多くの価値を追加するとは思わない
  • @EricRenoufの投稿が更新されました!
  • 別の派生物役に立つかもしれません。これはPIDを取得し、同時にそれを(ほとんど)フォアグラウンドプロセスとして扱います:sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $? `
  • isnt APP = main & PIDを取得する方法は?

回答

次のような方法を試してください

pidof my_app >> /tmp/my_app.pid 

コメント

  • 外部コマンド、システムがPIDを直接提供できる場合は、すべてのプロセスを検索してそれだけを見つける理由?また、'確実に'正しい値が得られるかどうか

回答

次のようにしてみてください:

 ps ef | grep "[m]y-app" | awk "{print $2}" 

プロセスの最初の文字を<の間に配置しますdiv id = "95f74068f1">

]は、リストにgrepプロセスが含まれていないことを確認します。必要に応じて、ユーザー名にgrepを追加することもできます。

コメント

  • その'せいぜい壊れやすく、my-appが複数回実行された場合は'機能しません- davidshen84 は特にそれについて心配していますcas。
  • このルートを使用する場合でも、代わりにpgrepを使用する必要があります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です