たとえば、サブシェル関数でgnuパラレルを使用しています。
func()(
parallel --will-cite sleep ::: 60
)
関数に送信した後、SIGTERM
並列処理も終了したいと思います。しかし、私は理解しています
$ func &
[1] 13255
$ pgrep -P 13255 # child of func -> the subshell
13256
$ pgrep -P 13256 # child of the subshell -> gnu parallel
13257
$ kill -TERM -- -13255 # terminating the process group
parallel: SIGTERM received. No new jobs will be started.
parallel: Waiting for these 1 jobs to finish. Send SIGTERM again to stop now.
parallel: sleep 60
$ kill -TERM -- -13255 # sending a second SIGTERM
bash: kill: (-18093) - No such process
したがって、プロセスIDを最初に追跡しないと、並列を終了できません。関数の内部にトラップを配置しようとしています。
func()(
trap "pkill -P $$; pkill -P $$; exit" TERM
parallel --will-cite sleep ::: 60
)
すべての子孫をpkill -P $$
終了する必要がありますが、検査の結果、ps $pid_of_parallel
最初の終了信号の後も並列が実行され続けることがわかりました。
funct &; kill $!
私の目標は、この関数とすべての子プロセスがすぐに終了するようにこの関数を作成することです。この目標をどのように達成できますか?
答え1
私は今、GNU Parallelの最新バージョンにこれが含まれていると思います。 GNU並列開発リストから:
2019年3月10日日曜日午後8時29分Ole Tangeによって書かれました:
今すぐGNU Parallelを停止するには、TERMを送信して新しいジョブの開始を停止し、別のTERMを送信して実行中のジョブを終了する必要があります。
新しいジョブの開始を停止するにはHUPを送信し、実行中のジョブを終了するにはTERMを送信するように変更しようとしています。
これにより、GNU Parallelをより簡単にシャットダウンできます。
$bash -c 'パラレル-j1 節電 ::: 111 222' &
次に、bashを使用してプロセスグループを並列に終了します。$キル-TERM-$!
これは以前のバージョンと互換性がありません。
したがって、最新バージョンにはこれが含まれます。お願い、お願い、これを破ることができるか確認してください。
新しい行動が前の行動より悪い例を挙げることができますか?
/オレ