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"
这更有意义。