バックグラウンドで実行されている関数の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
。