シェルスクリプトで最後に実行されたコマンドのPIDを取得する方法は?


254

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

my-app &
echo $my-app-pid

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

jobs -p my-appコマンドを使用してpidをgrep できることを知っています。しかし、シェルを複数回実行したい場合、この方法は機能しません。そのためジョブ仕様があいまいです。

回答:


338

最後に実行されたコマンドのPIDは、$!シェル変数にあります。

my-app &
echo $!

1
たとえば、pidを出力しています。[1] 893。数字だけが欲しい。
user3153014 14

33
これはバックグラウンドで開始されたプログラムの略です。バックグラウンドプロセスが開始されていない場合、パラメーターは設定されません。
ramrunner 14年

5
もう一つの立派な解決策は、(への答えにコメント)で提案されたばかり開始したプロセスのpidを取得する方法:ああ、および「oneliner」:/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &午後二時28分で、11月24日'10 sysfault -
IMZ -イワンZakharyaschev

14
@ user3153014「[2] 2625」などの文字列は、バックグラウンドタスクの開始後にシェルによって出力されます。これは次の出力とは関係ありませんecho $!
Petr Gladkikh

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

66

取得PID

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

PID変数に保存:

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

すべてのインスタンス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)"

3
質問はリダイレクションについて尋ねませんでしたが、あなたの答えは受け入れられたものとほとんど同じですが、インスタンスのインスタンスがmy-app終了し、おそらくさらに悪いことにPIDが後で再利用される場合、ファイルに悪い情報があります。私はこの答えは本当に既存の受け入れ答えに価値の多くを追加するとは思わない
エリックRenouf

@EricRenouf投稿を更新しました!
エドゥアルドクオモ

役に立つかもしれない別の派生物。これはPIDを取得し、同時に(ほとんど)フォアグラウンドプロセスとして扱います:sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?`
-mlathe

APP = main &PIDを取得する方法ではありませんか?
MrMesees

3

のようなものを試してください

pidof my_app >> /tmp/my_app.pid

1
システムがPIDを直接与えることができる場合、すべてのプロセスを検索してなぜそれを見つけることができるのか、外部コマンド、および低速ですか?また、正しい値が得られるかどうかは
わかり

-4

次のようなものを試してください:

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

プロセスの最初の文字を間に配置すると、リストにプロセスが表示され[ ]なくなりgrepます。必要に応じて、ユーザー名にgrepを追加することもできます。


9
それはせいぜい非常に壊れやすく、my-app複数回実行された場合は機能しません-davidshen84は特にそのcasを心配しています。
マット

2
このルートを使用する場合でも、pgrep代わりに使用する必要があります。
ウィレム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.