为什么在终端关闭而其他程序不关闭时,某些使用“&”从终端运行的程序会关闭?

27 command-line sudo execute-command

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

qtox &
Run Code Online (Sandbox Code Playgroud)

然后关闭终端,qtox用它关闭。但是在运行时etherape使用:

sudo etherape &
Run Code Online (Sandbox Code Playgroud)

关闭终端不会关闭或对 Etherape 造成任何问题。并且在不同的应用程序之间有不同的行为,有些在终端关闭时关闭,有些则没有,这是怎么回事?为什么有些人关闭而其他人不关闭?我正在使用 GNOME 3.18 运行 Ubuntu GNOME 15.10。

kos*_*kos 36

当您关闭终端时,终端会向外壳发送 SIGHUP 信号;反过来,shell 向其所有子进程组发送 SIGHUP 信号,其中包括后台进程组;

每个进程对信号的反应完全取决于进程:如果进程没有为信号定义处理程序并告诉内核(通过一些系统调用,例如signal()or sigaction())它希望处理它,内核将执行信号的默认处理程序,在 SIGHUP 信号的情况下包括终止进程。

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

  • 我*认为*`sudo` 没有什么神奇之处。`sudo` 只是作为另一个用户运行命令,你不能向其他用户的进程发送信号。参见`man 2 kill`。 (9认同)
  • 这就是为什么我们需要在那些关闭 SIGHUP 的命令前加上 `nohup` :) Upgoated (7认同)
  • @HagenvonEitzen 如果您愿意,但考虑到所有其他缺点,我会极力避免运行不需要“sudo”和“sudo”的命令,因为它具有“nohup”副作用。 (7认同)
  • @Serg 我们不需要 `nohup`,它会在它之后创建不需要的 `nohup.out` 文件。而是使用 `disown` 内置命令。 (2认同)