问题描述
我如何在shell的后台运行程序,并且能够在程序运行时关闭shell?假设我的用户界面出现问题或出于某种原因,我需要从终端窗口启动一个程序,比如nm-applet
:
nm-applet
当它启动时,它占据终端窗口的前景。
有没有简单的方法可以在后台运行程序,而无需让终端打开或占用整个终端?
在该说明中,我确实找到了一种方法来从终端运行程序,并允许其他输入,方法是在命令后附加一个和号(&
),如下所示:
nm-applet &
但是,这并没有多大用处,因为终端一旦关闭就会终止在终端启动的任何进程。
最佳解决方法
我最近变得喜欢setsid
。它开始看起来像你刚刚从终端运行的东西,但你可以断开(关闭终端),它只是继续前进。
这是因为该命令实际上是分叉的,并且在输入到达当前终端时,它由一个完全不同的父节点拥有(在关闭终端后该节点仍处于活动状态)。
一个例子:
setsid gnome-calculator
我也很偏袒disown
,它可以用来从当前树中分离出一个进程。您可以将它与后台符号一起使用:
gnome-calculator & disown
我也刚刚学会了用括号来产生子壳。这个简单的方法工作:
(gnome-calculator &)
正如你所提到的,当然还有nohup
。我对nohup
并不狂热,因为它倾向于写信给~/nohup.out
而我没有要求。如果你依靠那个,那可能是你的。
nohup gnome-calculator
对于longer-term进程,有些东西如screen
和其他虚拟terminal-muxers,它们使会话在连接之间保持活动状态。这些可能并不适用于您,因为您只是想临时访问终端输出,但如果您想稍后再回顾并查看最新的终端活动,则屏幕可能是您的最佳选择。
互联网上充满了screen
教程,但这里有一个简单的quick-start:
次佳解决方法
以下是我的两种方式。首先,不是从终端运行;点击Alt
+ F2
打开运行对话框,并从那里运行(不带&)。
从终端跑,跑
nm-applet &
但不要自己关闭终端。也就是说,不要打X-button关闭,也不要使用File – >从其菜单栏中退出。如果以这种方式关闭终端,它将向内部运行的bash发送一个HUP(挂起)信号,这反过来会将HUP信号发送给它的所有孩子(这就是为什么nohup在这种情况下工作的原因)。
相反,通过运行exit
或点击Ctrl
+ D
退出shell。然后bash会放弃其子项,然后退出,从而使后台进程仍在运行。当bash退出时,终端失去了子进程,所以它也会关闭。
一次完成:
nm-applet & exit
第三种解决方法
正如你所指出的,你可以跑步
nohup nm-applet &
在关闭终端时忽略结束信号。没有问题。
第四种方法
缺少许多其他答案的其中一件事是如何分离当前阻塞shell的正在运行的进程。在大多数终端和shell中,Ctrl
+ Z
将暂停正在运行的进程并返回到输入提示。然后,你可以发布
bg
将正在运行的进程发送到后台。问题
fg
而是将运行过程放回前台。
编辑:稍后我发现this answer中的更多细节。
第五种方法
使用(exec PROGRAM &> /dev/null & )
允许子shell的PID由PROGRAM
接管。我已经用几种不同的程序多次测试过这种方法。关闭原始终端对newly-spawned程序没有影响
小演示:
$ # this is before running
$ (exec firefox &> /dev/null &)
$ # and look, we still in side the terminal and can continue working
第六种方法
我可以推荐byobu码头。您可以通过按F6键轻松分离您的过程。