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

nm-applet


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

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

在那一点上,我确实找到了一种从终端运行程序并允许它运行的方法对于其他输入,可以通过在命令后附加一个&符号(&):

nm-applet &


但这没什么用,因为在终端中启动的任何进程都被杀死了终端关闭后。



评论

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

#1 楼

我最近来喜欢setsid。它开始看起来像您只是在终端上运行某些内容,但是您可以断开连接(关闭终端),并且一直在运行。到当前终端,它由完全不同的父级拥有(关闭终端后仍保持活动状态)。

示例:

setsid gnome-calculator


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

gnome-calculator & disown


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

(gnome-calculator &)


当然还有您提到的nohup。我对nohup并不陌生,因为它倾向于在没有我要求的情况下写给~/nohup.out。如果您依赖于此,那么它可能会适合您。

nohup gnome-calculator


对于长期的过程,诸如screen和其他虚拟终端多路复用器之类的东西会保留下来。连接之间的会话仍处于活动状态。这些可能并不真正适用于您,因为您只想临时访问终端输出,但是如果您想稍后再返回以查看最新的终端活动,则屏幕可能是您的最佳选择。
<互联网上到处都是screen教程,但这是一个简单的快速入门:


http://thingsilearned.com/2009/05/26/gnu-screen-super-基本教程/


评论


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

–关于坚果的坚果
13年2月7日在12:40



@nuttyaboutnatty将全部内容包装在自己的shell会话中:sh -c“ sleep 10s && cvlc'/home/omm.ogg'”&放弃。这几乎是我解决所有问题的解决方案,以确保它正确地分叉。

–奥利♦
2013年3月12日14:56



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

–奥利♦
2013年3月12日15:25



完美,对我有用的是子shell“(gnome-calculator&)”。我用它在后台启动一个单声道控制台应用程序。使用其他技术,mono应用程序将立即崩溃。

– Nikolaos Georgiou
13-10-28在20:55

将来的用户注意:可以通过将stdout和sterr都重定向到/ dev / null来抑制nohup.out的创建,如下所示:nohup firefox&> / dev / null&

– Sergiy Kolodyazhnyy
16年8月7日在18:13



#2 楼

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

从终端运行

nm-applet &


但是不要自己关闭终端。也就是说,不要点击X按钮关闭它,也不要在菜单栏中使用File-> Exit。如果您以这种方式关闭终端,它将向运行在其中的bash发送一个HUP(挂起)信号,这又将HUP信号发送给它的所有子节点(这就是在这种情况下nohup起作用的原因)。 >
相反,通过运行exit或按Ctrl + D退出外壳。然后bash将放弃其子级,然后退出,使后台进程仍在运行。当bash退出时,终端失去了其子进程,因此它也将关闭。

一次完成所有操作:

nm-applet & exit


评论


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

– 7hi4g0
15年1月24日在6:01

我在其他应用程序上尝试了此操作,但失败了:matlab&exit作为两个独立的命令运行得很好:matlab&exit

–马特凯利
16 Nov 10在20:00



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

–user1717828
17 Mar 29 '17 at 12:51

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

–蒂姆·贝克(Tim Baker)
18年2月2日在7:35

#3 楼

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

nohup nm-applet &  


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

评论


还有其他选择吗?只是为了了解,而不是为了其他

–OVERTONE
2012-2-22在0:38

在Wikipedia(en.wikipedia.org/wiki/Nohup)上,建议使用echo命令。现在我无法正常工作。

–desgua
2012-2-22在0:45



我不知道当您双击图标或程序时,它如何从UI中工作。

–OVERTONE
2012年2月23日在10:22

exec提供了nohup 的替代方法,用于在后台运行进程并返回当前的shell提示。

– JSStuball
19年7月30日在9:16

#4 楼

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

bg


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

fg


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

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

#5 楼

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

小演示:

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


评论


嗯(exec firefox)挂起终端,直到我退出Firefox ...并关闭终端SIGHUPs的外壳和子外壳

–kos
15年11月30日在11:48

我已经编辑了答案。用其他几个程序测试了它。我没有在此版本中观察到过Firefox或其他程序将控制终端挂起

– Sergiy Kolodyazhnyy
16年8月7日在18:39

对我来说效果很好

–詹娜♦
16年8月21日在19:12

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

– marinara
19/09/11'4:25

#6 楼

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

#7 楼

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

sudo -b matlab


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

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

#8 楼

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

评论


欢迎来到Ask Ubuntu!我建议编辑此答案以使用有关此操作的特定详细信息将其扩展。 (另请参阅我如何编写一个好的答案?以获取有关在Ask Ask Ubuntu上认为哪种答案最有价值的一般建议。)

–大卫·福斯特(David Foerster)
16年7月5日在22:51

#9 楼

如果使用KDE,还可以使用kstart,它将启动从终端分离的程序。它还确保为命令正确设置了KDE环境。
(请参阅kstart.cpp源代码以供参考。从那里可以看到,它使用KProcess::startDetached,并且KProcess派生自QProcess,并且startDetached开始新的过程,并与之分离。)

也是kde-openxdg-opengnome-open

评论


就目前而言,它看起来更像是评论,而不是答案。请编辑以展开。不要只说一口气。最好用引文解释您为什么对。没有解释的答案可能会被删除。

–anonymous2
19 Mar 5 '19 at 13:49