「&」を使用してターミナルから実行する一部のプログラムが、ターミナルが実行するときに閉じ、他のプログラムが閉じないのはなぜですか?


27

たとえば、次のもので起動qtoxしたとき、私はただ疑問に思っていました:

qtox &

そして、ターミナルをqtox閉じ、それで閉じます。ただし、次をetherape使用して実行する場合:

sudo etherape &

ターミナルを閉じても、Etherapeが閉じたり、問題が発生することはありません。また、さまざまなアプリケーション間で異なる動作があり、Terminalが近い場合もそうでない場合もありますが、どうしてですか?他の人が閉じないのになぜ閉じるのか?Ubuntu GNOME 15.10とGNOME 3.18を実行しています。


1
ターミナルを開いたり、qtoxを実行したり、ターミナルを閉じたり、すべてを実行することができますか。しかし、2番目はターミナルを開き、sudoがetherapeを実行し、ターミナルを閉じますが、sudoが閉じるまでsudoは実行し続けますか?
ケンモラーラップ

qtoxターミナルを閉じたときに終了したくない場合は、いつでも実行できますnohup qtox &
テランス

@Terrance:まあ、この質問では、私は特にありませんか...それは次のようになり、なぜ求めていた私の他の質問 ... :)

1
@ParanoidPandaああ、良い点。私の悪い。=)
テレンス

回答:


36

端末を閉じると、端末はSIGHUPシグナルをシェルに送信します。シェルは、バックグラウンドプロセスグループを含むすべての子プロセスグループにSIGHUPシグナルを送信します。

どのように各単一プロセスが信号に反応する完全にアッププロセスにある:プロセスがシグナルのハンドラを定義し、(いくつかのシステムコールを経由してのようなカーネルを教えてくれなかった場合signal()sigaction()、それを処理するために望んでいること)、カーネルの実行SIGHUPシグナルの場合、プロセスの終了で構成されるシグナルのデフォルトハンドラー。

ただし、でコマンドを実行するとsudosudoプロセスとその子プロセスのUIDは0(root)に設定されます。一般に、シグナルを送信するプロセスのUIDが0(ルート)またはターゲットプロセスと同じでない限り、カーネルはシグナルを破棄します(つまり、プロセスが別のユーザーが所有するプロセスにシグナルを送信できない信号の送信はルートが所有しています); そのため、ターミナルで実行されるBashインスタンスなどのユーザー実行プロセスはsudoプロセスをSIGHUPできず、最終的にターミナルを閉じてもで始まるプロセスには影響しませんsudo


7
それがnohup、SIGHUPに近いコマンドの前に必要な理由です:) Upgoated
Sergiy Kolodyazhnyy

9
に魔法は何もないと思いますsudosudo別のユーザーとしてコマンドを実行するだけで、他のユーザーのプロセスにシグナルを送信することはできません。をご覧くださいman 2 kill
el.pescado

@ el.pescadoそれでsudo、ある種の貧しい人はnohup
ハーゲンフォンアイゼン

7
あなたがしたい場合@HagenvonEitzenが、私は非常に必要としないコマンド実行中は控えたいsudosudo、そのためのnohup副作用を、他のすべての欠点と考えます。
コス

2
nohup不要な@Sergは、nohup.outその後に不要なファイルを作成します。むしろdisown組み込みコマンドを使用してください。
ルスラン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.