私が知る限り、仕事はパイプラインですこれらのタスクを管理できるシェルで実行します(fg
、、、Ctrl-Z)。bg
ジョブは複数のプロセス/コマンドで構成できます。
私の質問は、ソースを含むシェルが終了した場合、これらの操作はどうなりますか? huponexitが設定されていないと仮定するため、シェルが終了した後もバックグラウンドプロセスが続行されます。
私がしたことを仮定しましょう:
$ run.sh | grep 'abc' &
[1] job_id
その後、このシェルを終了します。新しいシェルに行って実行してみましょうjobs
。しかし、目立つものは何も表示されません。しかし、私はps aux | grep run.sh
プロセスが実行されているのを見ることができ、ps aux | grep grep
プロセスがgrep 'abc'
実行されているのを見ることができます。
一度にすべてを終了できるように、パイプライン全体のジョブIDを取得する方法はありますか?または、元のシェルを終了した後、他のシェルですべてのプロセスを個別に終了する必要がありますか? (後者を試してみましたが、うまくいきますが、すべてを追跡するのは面倒です。)
答え1
シェルが終了すると、バックグラウンドジョブにHUP信号を送信してジョブを終了させることができます。 SIGHUP信号は、シェル自体がSIGHUPを受信したときにのみ送信されます。つまり、シェルが正常に終了するのではなく(組み込みコマンドを使用するかexit
+Ctrl入力D)、端末が消えたとき(端末エミュレータプロセスが終了するため)にのみ送信されます。 。バラよりログアウト時にSIGHUPがジョブに送信されない場合は何ですか?そして子プロセスが親プロセスで終了するUNIXバリアントはありますか?詳細については。 Bashでは、huponexit
通常のシャットダウン時にSIGHUPをバックグラウンドジョブに送信するオプションを設定できます。 ksh、bash、zsh からジョブをdisown
呼び出すと、SIGHUP が送信されるジョブのリストからそのジョブが削除されます。 SIGHUPを受信するプロセスは信号を無視またはキャプチャすることができ、その後終了しません。nohup
SIGHUPの影響を受けないようにプログラムを実行するときにこれを使用します。
可能な SIGHUP によってプロセスが終了しない場合、プロセスは後ろに残ります。シェルのジョブ番号に関連付けることはできません。
プロセスが端末にアクセスしようとしたが端末がもう存在しない場合、プロセスはまだ終了する可能性があります。プログラムが存在しない端末にどのように反応するかによって異なります。
ジョブに複数のプロセス(パイプなど)が含まれている場合、すべてのプロセスは1つのプロセスにあります。プロセスグループ。プロセスグループは、複数の関連プロセスで構成されるシェル操作の概念を捉えるために正確に設計されています。プロセスグループID(PGID - 通常、グループ内の最初のプロセスのプロセスID)を表示して、ps l
Linuxまたは同様のプロセスグループ別にグループ化されたプロセスを表示できますps -o pid,pgid,tty,etime,comm
。
に負の引数を渡すことで、グループ内のすべてのプロセスを終了できますkill
。たとえば、終了するパイプのPGIDが1234であると判断した場合は、次のコマンドを使用して終了できます。
kill -TERM -1234
答え2
通常は実行し続けますが、忘れたり、気が変わった場合はnohupとdisownを使用する必要があります。
mike@mike-laptop4:~$ sleep 500
^Z
[1]+ Stopped sleep 500
mike@mike-laptop4:~$ bg
[1]+ sleep 500 &
mike@mike-laptop4:~$ jobs
[1]+ Running sleep 500 &
mike@mike-laptop4:~$ disown %1
mike@mike-laptop4:~$ jobs
mike@mike-laptop4:~$