如何在 shell 的后台运行程序,并能够在程序运行的同时关闭 shell?假设我的 UI 出现问题,或者出于某种原因,我需要从终端窗口启动程序,例如nm-applet
:
nm-applet
当它启动时,它占据终端窗口的前台。
有没有简单的方法可以在后台运行该程序,而无需保持终端打开或让其占据整个终端?
在那张纸条上,我确实找到了一种从终端运行程序并让其允许其他输入的方法,通过&
在命令后附加一个与符号 ( ),如下所示:
nm-applet &
但这没什么用,因为一旦终端关闭,在终端中启动的任何进程都会被终止。
答案1
我最近开始喜欢上了setsid
。它一开始看起来就像你只是在终端上运行某些东西,但你可以断开连接(关闭终端),它就会继续运行。
这是因为命令实际上分叉了,并且当输入到达当前终端时,它由完全不同的父级拥有(在关闭终端后仍然存在)。
一个例子:
setsid gnome-calculator
我也很喜欢使用disown
which 来将进程与当前树分开。你可以将它与后台的 & 符号结合使用:
gnome-calculator & disown
我还刚刚学习了如何使用括号生成子 shell。这个简单的方法有效:
(gnome-calculator &)
当然还有nohup
你提到的。我不太喜欢,因为它有一种在我不要求的情况下自动nohup
写入的倾向。如果你依赖它,它可能适合你。~/nohup.out
nohup gnome-calculator
对于长期进程,可以使用screen
和其他虚拟终端复用器等工具来保持连接之间的会话处于活动状态。这些可能并不适合您,因为您只想临时访问终端输出,但如果您想回去稍后再查看最新的终端活动,屏幕可能是您的最佳选择。
互联网上有很多screen
教程,但这里有一个简单的快速入门:
答案2
以下是我采用的两种方法。首先,不要从终端运行它;按Alt+F2打开运行对话框,然后从那里运行它(不带 &)。
从终端运行
nm-applet &
但不要自己关闭终端。也就是说,不要点击 X 按钮来关闭,也不要从菜单栏中使用文件 -> 退出。如果以这种方式关闭终端,它将向其中运行的 bash 发送 HUP(挂断)信号,而 bash 又会将 HUP 信号发送给其所有子进程(这就是 nohup 在这种情况下起作用的原因)。
exit
相反,通过运行或点击Ctrl+退出 shell。bashD将放弃其子进程,然后退出,而后台进程仍在运行。当 bash 退出时,终端已失去其子进程,因此它也会关闭。
一次性完成所有操作:
nm-applet & exit
答案3
正如你所指出的,你可以运行
nohup nm-applet &
关闭终端时忽略结束信号。这样没问题。
答案4
用于(exec PROGRAM &> /dev/null & )
允许子 shell 的 PID 被接管PROGRAM
。我已经用几个不同的程序多次测试了这种方法。关闭原始终端对新生成的程序没有影响
小演示:
$ # this is before running
$ (exec firefox &> /dev/null &)
$ # and look, we still in side the terminal and can continue working