Answers:
您没有提及它是作为X应用程序运行还是作为控制台应用程序运行。
如果它是作为控制台应用程序,则当然需要关闭。您摆脱了它的输入/输出,更确切地说,摆脱了它所在的(伪)tty。这不太可能是您的意思,所以让我们假设您正在谈论X应用程序。
nohup应该可以工作,不确定为什么不可以。当外壳关闭时,它将发送SIGHUP到其进程组中的所有进程。nohup告诉命令忽略SIGHUP。
您也可以尝试使用setsid,它使流程与流程组断开连接
alias emacs='setsid emacs'
或在disown之后添加&
最可靠的方法似乎是:
(setsid emacs &)
这用于( &)派生到后台,并setsid与控制tty分离。
您可以将其放在shell函数中:
fork() { (setsid "$@" &); }
fork emacs
可能是:
该disown内建命令:
emacs &
disown $!
&充当命令分隔符,并且disown默认为最新作业,因此可以缩短为:
emacs & disown
双fork():
(emacs &)
括号内的命令在( )单独的shell进程中运行。
setsid正如Rich所建议的那样,可能是最佳选择,因为它通过创建一个新的会话来取消流程的控制TTY :
setsid emacs
但是,这也有点不可预测-仅fork()当它是进程组的领导者时才会进入后台(例如,如果setsid在sh脚本中使用,则不会发生;在这种情况下,它只会变得对Ctrl- C。)
(exec emacs)吗?
(emacs)。如果给子外壳一个命令,exec则至少在情况下暗含bash。同样适用于bash -c 'foo'对bash -c 'exec foo'。(但是,请注意emacs 本身可能正在与终端分离;例如gvim这样做。最好使用行为已知的程序进行测试。)
检查您的外壳设置。您也可以尝试使用屏幕代替nohup。
screen -r如果您Ctrl-A Ctrl-D在注销之前使用它来断开连接,屏幕允许您稍后重新进入该过程。
screen -d -m sh -c "{do stuff } exit"这更有意义。