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を一覧表示するオプションを使用する必要があります-j
。ps
ここで見ることができます:
[...]
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
。いいえ、サブシェルは終了時にサブシェルを終了しないため、シェルは使用できなくなります(サブシェルが交換されているため使用できないことがここで明らかになりました)。xeyes
bash
xeyes
xeyes
また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
作成しましたが、そのプロセスグループには作成されていないことがわかります。 。zsh
7246
bash
Xorg
&
これは、サブシェルでXorg
開始されたコマンドが新しいジョブで開始されないためではなく、Xorg
そのtty2端末を接続するために、まったく新しいセッション(プロセスグループはもちろん)を開始するためです。
したがって、Xorg
プロセスグループから自分自身を削除すると、プロセスグループはkill %1
終了しません。
kill %1
課題なので注意してくださいプロセスグループ、単一のPIDではありません。プロセスグループにシグナルを送信するには、次の手順を実行する必要があります。
kill -- -7246
上記の例では、pid 7246(bashサブシェル)と7274(xeyes
)は終了しますが、Xorg
(7247)は7246プロセスグループに属していないため終了しません。