如何分叉一个当 shell 退出时不会终止的进程?

如何分叉一个当 shell 退出时不会终止的进程?

如果我从 shell 运行 emacs:

$ emacs foo &

然后杀死该shell,emacs就死了。

我怎样才能运行一个命令以便它不会随着 shell 的死亡而死亡?

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

$ nohup emacs foo &

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

答案1

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

如果它是一个控制台应用程序,当然需要关闭。你删除了它的输入/输出,更准确地说是它所在的(伪)tty。这不太可能是你的意思,所以让我们假设你正在谈论一个X应用程序。

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

您还可以尝试 setsid,它将进程与进程组断开连接

alias emacs='setsid emacs'

或者disown在之后添加&

答案2

最可靠的方法似乎是:

(setsid emacs &)

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

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

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

fork emacs

可能性包括:

  • 内置命令disown

    emacs &
    disown $!
    

    &充当命令分隔符,并disown默认为最近的作业,因此可以缩短为:

    emacs & disown
    
  • 双倍的fork()- :

    (emacs &)
    

    括号内的命令( )在单独的 shell 进程中运行。

  • setsid,正如 Rich 所建议的,可能是最好的选择,因为它通过创建一个新的来取消进程的控制 TTY会议

    setsid emacs
    

    然而,它也有点不可预测——只有当它是一个进程组的领导者时,它才会进入后台(例如,如果在脚本中使用,fork()则不会发生这种情况;在这种情况下,它只会对 Ctrl-C 产生抵抗作用。)setsidsh

答案3

检查你的 shell 设置。你也可以尝试屏幕代替nohup

相关内容