プロセスを正常に終了するには送信する必要がありますが、これはSIGINT
できません。
実行が起こる環境が「不明」(travis.comのbashスクリプト)なので、例です。
私はこのようなプロセスを開始して同じ動作を得ることができました。(command &) &
vagrant@host:~$ (sleep 40 &) &
[1] 8473
vagrant@host:~$ ps -o pid,pgid,args
PID PGID COMMAND
2787 2787 -bash
8474 8473 sleep 40
8490 8490 ps -o pid,pgid,args
[1]+ Done ( sleep 40 & )
vagrant@host:~$ kill -INT 8474 ##### here I send SIGINT to the process
vagrant@host:~$ kill -INT -8473 ##### here I send SIGINT to the process group
vagrant@host:~$ ps -o pid,pgid,args
PID PGID COMMAND
2787 2787 -bash
8474 8473 sleep 40
8559 8559 ps -o pid,pgid,args
シグナルとグループについて検索して読みましたが、ここで何が起こっているのかわかりません。どの時点でシグナルは無視されましたか?何が問題なの?SIGINT
このsleep
プロセスにどのように送信できますか?
編集する:SIGTERM
使用するとプロセスは終了します。 (たぶん親 - 子シェルが終了するのでしょうか?)
答え1
非対話型ジョブがSIGINTに応答するには、SIGINTのハンドラーを作成する必要があります。
$ ( (trap "echo Got SigInt" SIGINT; sleep 60) & ) &
[1] 13619
$
[1]+ Done ( ( trap "echo Got SigInt" SIGINT; sleep 60 ) & )
$ ps -o pid,pgid,args
PID PGID COMMAND
11972 11972 bash
13620 13619 bash
13621 13619 sleep 60
13622 13622 ps -o pid,pgid,args
$ kill -INT 13620
$ kill -INT 13621
$ Got SigInt
睡眠プロセスにSIGINTを送信する
Stéphane Chazelasがコメントで提案したように、SIGINTのデフォルトの動作を返すことが目標である場合は、次のようにtrap - SIGINT
使用できます。
$ ( (trap - SIGINT; sleep 60) & ) &
[1] 16690
$ ps -o pid,pgid,args
PID PGID COMMAND
11972 11972 bash
16691 16690 bash
16692 16690 sleep 60
16693 16693 ps -o pid,pgid,args
[1]+ Done ( ( trap - SIGINT; sleep 60 ) & )
$ kill -INT 16692
$ ps -o pid,pgid,args
PID PGID COMMAND
11972 11972 bash
16698 16698 ps -o pid,pgid,args