为什么有些终端从终端运行时使用“&”关闭了某些程序,而有些终端却没有呢?


27

我只是想知道,例如当我启动qtox时:

qtox &

然后关闭Terminal,并qtox关闭它。但是,etherape使用以下命令运行时:

sudo etherape &

关闭终端不会关闭或对Etherape造成任何问题。在不同的应用程序中,会有不同的行为,有些在Terminal时关闭,而其他在终端时不关闭,为什么呢?为什么有些人不关门?我正在使用GNOME 3.18运行Ubuntu GNOME 15.10。


1
可能是打开终端,运行qtox,关闭终端,全部!!但是第二个是打开终端,sudo运行etherape,现在关闭终端,但是sudo一直运行直到sudo关闭?
肯·莫勒鲁普

好吧,如果您不希望qtox在关闭终端时退出,则可以始终使用来运行它nohup qtox &
Terrance

@Terrance:好吧,在这个问题上,我专门问为什么,而不是……那是我的另一个问题 ……:)

1
@ParanoidPanda啊,好点。我的错。=)
Terrance

Answers:


36

当您关闭终端时,终端会向外壳发送SIGHUP信号。外壳程序依次向其所有子进程组(包括后台进程组)发送SIGHUP信号;

每个进程如何对信号做出反应完全取决于进程:如果进程没有为信号定义处理程序,并告诉内核(通过诸如signal()或的系统调用sigaction())希望处理该信号,则内核执行信号的默认处理程序,对于SIGHUP信号,该处理程序包括终止进程。

但是,当使用来运行命令时sudo,该sudo进程及其子进程的UID 设置为0(root); 通常,除非发送信号的进程的UID是0(根)或与目标进程相同,否则内核会消除该信号(即:一个进程无法将信号发送给另一个用户拥有的进程,除非该进程发送信号归root所有); 这就是为什么用户运行的进程(例如由终端运行的Bash实例)无法SIGHUP sudo进程,并且最终关闭终端不会影响以开头的进程sudo


7
这就是为什么我们需要nohup在与SIGHUP一起关闭的那些命令前面:)上位
Sergiy Kolodyazhnyy 2015年

9
认为这没有什么魔术sudosudo只是以其他用户身份运行命令,而您无法将信号发送给其他用户的进程。请参阅man 2 kill
el.pescado

@ el.pescado那么,这是sudo一个穷人nohup吗?
哈根·冯·埃岑

7
@HagenvonEitzen如果你想要的,但我强烈运行,不需要命令避免sudosudo它的nohup副作用,考虑了所有其他方面的不足。
kos 2015年

2
@Serg我们不需要nohup,它会nohup.out在之后创建不需要的文件。而是使用disown内置命令。
Ruslan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.