Linux / Unix Bashスクリプトはどのようにして独自のPIDを知っていますか?


149

という名前のスクリプトがBash Script.shにあり、それ自体のPIDを知る必要があります(つまり、Script.sh内でPIDを取得する必要があります)。

これを行う方法はありますか?

回答:



65

使用する $BASHPIDまたは$$

2つの違いを含む詳細については、マニュアルを参照してください。

TL; DRTFM

  • $$ シェルのプロセスIDに展開します。
    • ()サブシェルは、起動したシェルではなく、サブシェルのプロセスIDに展開されます。
  • $BASHPID 現在のBashプロセスのプロセスIDに展開されます。
    • ()サブシェル、それはサブシェルのプロセスIDに展開されます

10
$$とBASHPIDは常に同じではないことに注意してください-マニュアルではこれについて言及しており、ここにはより具体的な例があります:tldp.org/LDP/abs/html/internalvariables.html。多くのbash構成要素はサブシェルで実行されるため、区別は非常に重要です。
Cascabel

@Jefromi-記載されています。それが私がマニュアルにリンクした理由の1つでした。
tvanfosson

2
これは、ことに留意すべきである$BASHPIDBASH 4. BASH 3.xを使用している場合は、新規にあり、あなたが使用する必要があります$$
ブルーノBronosky

36

Jefromiが参照する『Advanced Bash Scripting Guide』に記載されている例に加えて、これらの例はパイプがサブシェルを作成する方法を示しています。

$ echo $$ $BASHPID | cat -
11656 31528
$ echo $$ $BASHPID
11656 11656
$ echo $$ | while read line; do echo $line $$ $BASHPID; done
11656 11656 31497
$ while read line; do echo $line $$ $BASHPID; done <<< $$
11656 11656 11656

「<<<」の意味を教えてください。ありがとう。
ソパラホデアリエーレス2014年

4
文字列をループ(またはを読み取るものstdin)にリダイレクトします。文字列は「ここの文字列」と呼ばれます。
追って通知があるまで一時停止。

8

PIDはに保存され$$ます。

例:kill -9 $$呼び出し元のシェルインスタンスを強制終了します。


kill -9-9フラグ付き)は有害であると見なされ、絶対に必要な場合にのみ使用されます)。
Willem Van Onsem

3
プロセスはシグナルに応答する(そしてそれ自体のクリーンアップを行う)機会がないため、「危険」と見なされます。行うことkill -9 $$は正確に1つのことを行います。現在のシェルプロセスを強制終了します。あなたがに書かれたくないことをシェルセッションで何かを行っている場合に便利である.bash_historyように:docker run -e PASSWORD=hunter2 ircbot
ブルーノBronosky


0

プロセスが子プロセスであり、$ BASHPIDが設定されていない場合、実行中のプロセスの作成された子プロセスのppidを照会できます。少し見苦しいかもしれませんが、動作します。例:

sleep 1 &
mypid=$(ps -o ppid= -p "$!")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.