如果我从 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 产生抵抗作用。)setsid
sh
答案3
检查你的 shell 设置。你也可以尝试屏幕代替nohup
。