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)
可能性是:
该disown
内建命令:
emacs &
disown $!
Run Code Online (Sandbox Code Playgroud)
&
充当命令分隔符,disown
默认为最近的作业,因此可以缩短为:
emacs & disown
Run Code Online (Sandbox Code Playgroud)双- fork()
:
(emacs &)
Run Code Online (Sandbox Code Playgroud)
括号内的命令在(
)
单独的 shell 进程中运行。
setsid
,正如 Rich 所建议的那样,可能是最好的选择,因为它通过创建一个新会话来取消设置进程的控制 TTY :
setsid emacs
Run Code Online (Sandbox Code Playgroud)
然而,它也有点不可预测——fork()
如果它是进程组的领导者,它只会作为背景(例如,如果setsid
在sh
脚本中使用,则不会发生这种情况;在这种情况下,它只会变得抗 Ctrl- C。)
Ric*_*lka 16
您没有提及它是作为 X 应用程序还是控制台应用程序运行。
如果是作为控制台应用程序,当然需要关闭。你摆脱了它的输入/输出,从技术上讲是它所在的(伪)tty。这不太可能是您的意思,所以让我们假设您在谈论 X 应用程序。
nohup
应该可以,不知道为什么不行。当 shell 关闭时,它会发送SIGHUP
给其进程组中的所有进程。nohup 告诉命令忽略 SIGHUP。
你也可以试试setsid,它会断开进程与进程组的连接
alias emacs='setsid emacs'
Run Code Online (Sandbox Code Playgroud)
或者在disown
后面添加&
归档时间: |
|
查看次数: |
50455 次 |
最近记录: |