バックグラウンド関数「$!」のPIDが無効な値を提供します。

バックグラウンド関数「$!」のPIDが無効な値を提供します。

バックグラウンドで実行されている関数のPIDをキャプチャしようとしていますが、数値が間違っているようです。

次のスクリプトを参照してください。

$ cat test1.sh 
#!/bin/bash

set -x

child() {
    echo "Child thinks is $$"
    sleep 5m 
}

child &
child_pid="$!"
echo "Parent thinks pid $child_pid"

sleep 3
kill -- -"$child_pid" # but it is wrong, get "No such process"

kill -- -"$$"
wait

この関数を使用して、親プロセスが子プロセスを終了したいのですが、次のような結果が得られます。

$ ./test1.sh 
+ child_pid=44551
+ echo 'Parent thinks pid 44551'
Parent thinks pid 44551
+ sleep 3
+ child
+ echo 'Child thinks is 44550'
Child thinks is 44550
+ sleep 5m
+ kill -- -44551
./test1.sh: line 15: kill: (-44551) - No such process
+ kill -- -44550
Terminated

私はこの質問を読んだ。バックグラウンド実行関数のPIDを取得します。しかし、答えは私が観察したものと矛盾するようです。

それでは、親コードから関数の正しいPIDを取得するには、上記のコードをどのように変更する必要がありますか?


いくつかのテストの後、マイナス記号のないコマンドが機能するようです。

kill -- "$child_pid" 

childしかし、それを終了するときにそのサブプロセスを終了したいので、これは私の要件には不十分です。

ベストアンサー1

$!正しい値を指定してください。
$$確かに。$BASHPID代わりに使用

バラよりman bash

バッシュPID

現在のbashプロセスのプロセスIDに展開されます。これは、bashを再初期化する必要がないサブシェルのような場合に応じて$ $とは異なります。 BASHPID 割り当ては効果がありません。

kill -- -PIDなぜうまくいかないのかわからず、再現できません。代わりにこれを使用できますpkill -P PID

おすすめ記事