从终端在后台运行程序


136

如何在Shell后台运行程序,并能够在运行程序的同时关闭Shell?假设我的UI出现问题,或者由于某种原因,我需要从终端窗口启动程序,例如nm-applet

nm-applet

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

有什么简单的方法可以在后台运行程序而无需打开终端或使其占据整个终端?

关于这一点,我确实找到了一种从终端运行程序并使它允许其他输入的方法,方法是&在命令后面附加一个&符号():

nm-applet &

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


7
nohup'command'&这似乎起作用。有什么问题吗?
OVERTONE'2

Answers:


173

我最近很喜欢setsid。它开始看起来像您只是在从终端运行某些东西,但是您可以断开连接(关闭终端),并且一直在运行。

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

一个例子:

setsid gnome-calculator

我也很偏向于disown将进程与当前树分开。您可以将其与背景“&”符号结合使用:

gnome-calculator & disown

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

(gnome-calculator &)

当然,nohup正如您所提到的。我并不在意,nohup因为它倾向于在~/nohup.out没有我要求的情况下写信。如果您依靠它,那可能适合您。

nohup gnome-calculator

对于长期过程,还有诸如screen虚拟终端复用器之类的东西可以使连接之间的会话保持活动状态。这些可能并不真正适用于您,因为您只想临时访问终端输出,但是如果您想稍后再返回以查看最新的终端活动,则屏幕可能是您的最佳选择。

互联网上满是screen教程,但这是一个简单的快速入门:


奥利(Oli),在DISPLAY =:0 unity的情况下– 替换您将使用上面的哪一个,为什么?
关于natty的坚果,

4
@nuttyaboutnatty将所有内容包装在自己的shell会话中:sh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown。这几乎是我解决所有问题的解决方案,以确保它正确地分叉。
奥利(Oli)

1
@nuttyaboutnatty这就是我的意思,但是您不会最终运行两个实例,因为--replace听起来确实如此,并且实际上结束了旧实例。从xsession内第二次运行它会终止绑定到TTYn的副本,并在将来需要时允许您使用它。这样做可能有更好的方法,但是每次需要时,我都会想到。
奥利(Oli)

1
完美,对我有用的是subshel​​l'(gnome-calculator&)'。我用它在后台启动一个单声道控制台应用程序。使用其他技术,mono应用程序将立即崩溃。
Nikolaos Georgiou

2
未来用户注意nohup.out可以通过重定向stdout和sterr来抑制的创建,/dev/null例如:nohup firefox &> /dev/null &
Sergiy Kolodyazhnyy

55

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

从终端运行

nm-applet &

但是不要自己关闭终端。也就是说,不要点击X按钮关闭它,也不要在菜单栏中使用File-> Exit。如果以这种方式关闭终端,它将向内部运行的bash发送一个HUP(挂起)信号,这又会将HUP信号发送给它的所有子节点(这就是在这种情况下nohup起作用的原因)。

而是通过运行exit或按Ctrl+ 退出外壳D。然后bash将放弃其子级,然后退出,使后台进程仍在运行。当bash退出时,终端失去了其子进程,因此它也将关闭。

一次完成所有操作:

nm-applet & exit

太棒了!从来都不知道,您似乎是唯一提及此事的人。无疑,在桌面环境中,这是我最喜欢的方法。太糟糕了,我无法
投票

我在其他应用程序上尝试了此操作,但失败了:matlab & exit由于两个单独的命令运行良好:matlab & exit
MattKelly

我想知道为什么OP表示关闭终端会导致他的后台程序崩溃。我从未尝试通过窗口上的“ x”按钮关闭终端。
user1717828

x按钮被杀死,它不会干净退出,exit命令会退出。您可以改为将x按钮重新映射到退出命令...
Tim Baker,

14

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

nohup nm-applet &  

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


还有其他选择吗?只是为了knowings着想,不为别的
泛音

在Wikipedia(en.wikipedia.org/wiki/Nohup)上有一个使用建议echo command | at now,我无法使其正常工作。
desgua 2012年

2
我想知道当您双击图标或程序时,它如何从UI中工作。
OVERTONE '02

exec提供了nohup <command> &在后台运行进程并返回当前shell提示的替代方法。
JSStuball

12

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

bg

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

fg

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

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


7

使用(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

(exec firefox)挂终端,直到我离开Firefox ...和关闭接线SIGHUPs壳和子shell
科斯

我已经编辑了答案。用其他几个程序测试了它。我没有在此版本中观察到过用firefox或其他程序
挂住

对我来说效果很好
Zanna

我不认为使用bash的exec是必要的,可能由于某种原因您需要PID。
marinara

2

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


1

尽管上面有不错的答案,但我还是想给我2美分的关于我如何在后台使用MATLAB的信息。

sudo -b matlab

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

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


0

我不知道它的正确方法,但我只是在离开上一个会议的同时又开始了另一个会议。例如,我在树莓派上运行了一个简单的Web服务器。web.py一个。然后我开始一个新的会话,同时不理会它。而已。这也非常有用,因为即使您正在其他会话上工作,您仍然可以更新。


2
欢迎来到Ask Ubuntu!我建议编辑此答案以将其扩展为有关如何执行此操作的特定详细信息。(另请参阅“我如何编写一个好的答案?”,以获取有关在Ask Ask Ubuntu上认为最有价值的答案的一般建议。)
David Foerster,2016年

0

如果使用KDE,还可以使用kstart,它将启动与终端分离的程序。它还确保为命令正确设置了KDE环境。(请参阅kstart.cpp源代码以供参考。如您所见,它使用KProcess::startDetachedKProcess并派生自QProcess,并startDetached启动一个新进程,然后从中分离。)

kde-openxdg-open或也相似gnome-open


从目前的情况来看,它看起来更像是评论而不是答案。请编辑以展开。不要只说一口气。最好用引文解释您为什么对。没有解释的答案可能会被删除。
匿名2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.