当前位置: 首页>>技术问答>>正文


从终端在后台运行程序

, , , ,

问题描述

我如何在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键轻松分离您的过程。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/474.html,未经允许,请勿转载。