サブシェルジョブの説明

サブシェルジョブの説明

Xorgをテストするためのコマンドを実行し、(Xorg & sleep 3; xeyes) &より簡単な管理のためにこれを単一のサブシェルバ​​ックグラウンドジョブにグループ化しました。これはうまく機能し、3秒後に新しいXorgセッションでxeyesを開きます。

コマンドを実行すると、次の出力が表示されます。

[1] 635

check new process を実行すると、ps -ef次のような出力が表示されます。

root    635    361    0    4:52    tty1    00:00:00    -bash
root    636    365    0    4:52    tty2    00:00:00    /usr/lib/Xorg
root    639    365    0    4:52    tty1    00:00:00    xeyes

これはかなり標準的な出力であるようで、予想通りです。私のXサーバーが期待どおりに機能していることを確認した後、kill %1このコマンドを実行した後、私のプロセスは次のようになります。

root    636    1    0    4:52    tty2    00:00:00    /usr/lib/Xorg

Xorgを終了できないのはなぜですか?サブシェルが正常に終了し、xeyesが正しく閉じられるがXorgをインポートできないのはなぜですか? Xorgの親プロセスがサブシェルの代わりに1になるのはなぜですか?サブシェルがシャットダウン時にすべてのサブプロセスにシャットダウン信号を送信しないでください。

また、killを使用してグループを終了するとkill 635(多くのリソースでこれが同じである必要があると言います)、kill %1プロセスの状態がさらに奇妙になります。

root    636    1    0    4:52    tty2    00:00:00    /usr/lib/Xorg
root    639    1    0    4:52    tty1    00:00:00    xeyes

何? ? ?今、両方のプロセスが終了できず、両方がPID 1のサブプロセスであるのはなぜですか?何が起こったのか、私は何が間違っていましたか?

私に何をすべきかを教えてくれることに加えて、ここで何が起こっているのかについて深く説明してください。

ベストアンサー1

ジョブ制御を監視するには、プロセスグループIDとセッションIDを一覧表示するオプションを使用する必要があります-jps

ここで見ることができます:

[...]
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
chazelas  6805  4172  6805  6805  0 06:47 pts/7    00:00:00 /bin/zsh
chazelas  6825  6805  6825  6805  0 06:48 pts/7    00:00:00 xeyes
root      6826  6825  6826  6826  0 06:48 tty2     00:00:00 /usr/lib/xorg/Xorg :4
[...]

あなたが見ているのは、私のシェルがサブシェルのプロセスよりも最適化されていて、サブシェルの最後のコマンドであるため、サブシェルのプロセス内で実行されるため、サブシェルですXorg。いいえ、サブシェルは終了時にサブシェルを終了しないため、シェルは使用できなくなります(サブシェルが交換されているため使用できないことがここで明らかになりました)。xeyesbashxeyesxeyes

またbash

$ ps -Afj
[...]
UID        PID  PPID  PGID   SID  C STIME TTY          TIME CMD
chazelas  7230  6805  7230  6805  0 06:54 pts/7    00:00:00 bash
chazelas  7246  7230  7246  6805  0 06:54 pts/7    00:00:00 bash
root      7247  7246  7247  7247  2 06:54 tty2     00:00:00 /usr/lib/xorg/Xorg :4
chazelas  7274  7246  7246  6805  0 06:54 pts/7    00:00:00 xeyes
[...]

bash終了するのを待ってから、それ以降は何もしない不要な追加プロセスがありますxeyes。それ以外は と同じです。シェルが新しいプロセスグループ(6825 for、for)をzsh作成しましたが、そのプロセスグループには作成されていないことがわかります。 。zsh7246bashXorg

&これは、サブシェルでXorg開始されたコマンドが新しいジョブで開始されないためではなく、Xorgそのtty2端末を接続するために、まったく新しいセッション(プロセスグループはもちろん)を開始するためです。

したがって、Xorgプロセスグループから自分自身を削除すると、プロセスグループはkill %1終了しません。

kill %1課題なので注意してくださいプロセスグループ、単一のPIDではありません。プロセスグループにシグナルを送信するには、次の手順を実行する必要があります。

kill -- -7246

上記の例では、pid 7246(bashサブシェル)と7274(xeyes)は終了しますが、Xorg(7247)は7246プロセスグループに属していないため終了しません。

おすすめ記事