如何在 shell 退出时分叉一个不会死的进程?

sli*_*cki 37 linux terminal shell forking nohup

如果我从 shell 运行 emacs:

$ emacs foo &
Run Code Online (Sandbox Code Playgroud)

然后杀死那个外壳,emacs 死了。

如何运行命令使其在 shell 死机时不会死机?

我找到了对 nohup 的引用,但这似乎没有帮助:

$ nohup emacs foo &
Run Code Online (Sandbox Code Playgroud)

当 shell 死亡时,仍然会杀死 emacs。

use*_*686 45

最可靠的方法似乎是:

(setsid emacs &)
Run Code Online (Sandbox Code Playgroud)

这用于( &)分叉到后台,并setsid与控制 tty 分离。

你可以把它放在一个shell函数中:

fork() { (setsid "$@" &); }

fork emacs
Run Code Online (Sandbox Code Playgroud)

可能性是:


Ric*_*lka 16

您没有提及它是作为 X 应用程序还是控制台应用程序运行。

如果是作为控制台应用程序,当然需要关闭。你摆脱了它的输入/输出,从技术上讲是它所在的(伪)tty。这不太可能是您的意思,所以让我们假设您在谈论 X 应用程序。

nohup应该可以,不知道为什么不行。当 shell 关闭时,它会发送SIGHUP给其进程组中的所有进程。nohup 告诉命令忽略 SIGHUP。

你也可以试试setsid,它会断开进程与进程组的连接

alias emacs='setsid emacs'
Run Code Online (Sandbox Code Playgroud)

或者在disown后面添加&


Jos*_*h K 5

检查你的外壳设置。您也可以尝试使用screen代替nohup.