从终端运行后台程序

如何在shell的后台运行程序,能够在程序运行时关闭shell? 让我说我的UI出现问题或出于某种原因,我需要从终端窗口启动一个程序,比如说, nm-applet

 nm-applet 

当它启动时,它占据了终端窗口的前景。

有没有简单的方法在后台运行程序而无需让终端打开或占用整个终端?

在那个注意事项中,我确实找到了一种从终端运行程序的方法,并允许其他输入,方法是在命令中添加&符号( & ):

 nm-applet & 

但这并没有多大用处,因为一旦终端关闭,终端中启动的任何进程都会被终止。

我最近喜欢setsid 。 它开始看起来你只是从终端运行的东西,但你可以断开(关闭终端),它只是继续前进。

这是因为命令实际上是分叉的,当输入到达当前终端时,它由完全不同的父级拥有(在关闭终端后它仍然存在)。

一个例子:

 setsid gnome-calculator 

我也非常偏向于可以用来将进程与当前树分开的disown 。 您将它与背景&符号结合使用:

 gnome-calculator & disown 

我也刚刚学会了用括号生成子壳。 这个简单的方法有效:

 (gnome-calculator &) 

当然,正如你所提到的那样,没有。 我对nohup并不狂热,因为它倾向于在没有我要求的情况下写入~/nohup.out 。 如果你依赖它,它可能适合你。

 nohup gnome-calculator 

对于长期流程,有一些事情,如screen和其他虚拟终端复用器,可以在连接之间保持会话活跃。 这些可能并不适用于您,因为您只想临时访问终端输出,但如果您想稍后返回并查看最新的终端活动,屏幕可能是您的最佳选择。

互联网上有很多screen教程,但这里有一个简单的快速入门:

这是我选择的两种方式。 首先,不要从终端运行它; 按Alt + F2打开运行对话框,然后从那里运行(不带&)。

从终端,运行

 nm-applet & 

但不要自己关闭终端。 也就是说,不要按X键关闭,也不要使用文件 – >从菜单栏退出。 如果你以这种方式关闭终端,它会向运行中的bash发送一个HUP(Hang UP)信号,然后bash将向其所有子节点发送HUP信号(这就是为什么nohup在这种情况下工作)。

而是通过运行exit按Ctrl + D退出shell。 然后bash将拒绝其子项,然后退出,使后台进程仍然运行。 当bash退出时,终端已丢失其子进程,因此它也将关闭。

一次完成所有操作:

 nm-applet & exit 

正如您所指出的,您可以运行

 nohup nm-applet & 

关闭终端时忽略结束信号。 没问题。

许多其他答案缺少的一件事是如何分离当前阻止shell的正在运行的进程。 在大多数终端和shell中, Ctrl + Z将暂停正在运行的进程并返回输入提示符。 然后,你可以发出

 bg 

将正在运行的进程发送到后台。 问题

 fg 

而是将正在运行的进程放回前台。

编辑 :我后来发现的这个答案的更多细节。

使用(exec PROGRAM &> /dev/null & )允许(exec PROGRAM &> /dev/null & ) PID由PROGRAM接管。 我已经用几个不同的程序多次测试了这种方法。 关闭原始终端不会影响新生成的程序

小演示:

 $ # this is before running $ (exec firefox &> /dev/null &) $ # and look, we still in side the terminal and can continue working 

我可以推荐byobu终端。 您可以通过按F6键轻松分离您的过程。

虽然上面有很好的答案,但我想就我如何在后台使用MATLAB给出2美分。

 sudo -b matlab 

sudo的-b标记可以在后台运行应用程序。 您也可以在执行此命令后关闭终端。

可能,无关,但有一个很棒的网站,你可以用来解释shell命令。 http://explainshell.com/explain/8/sudo

我不知道它正确的方式,但我只是开始另一个会话,而留下前一个人。 例如,我在我的树莓上运行了一个简单的Web服务器。 web.py一个。 然后我开始一个新的会议,而不管它。 而已。 它也很有用,因为即使你在另一个会话上工作,你仍然会更新。