从终端在后台运行程序

从终端在后台运行程序

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

nm-applet

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

有没有简单的方法可以在后台运行该程序,而无需保持终端打开或让其占据整个终端?

在那张纸条上,我确实找到了一种从终端运行程序并让其允许其他输入的方法,通过&在命令后附加一个与符号 ( ),如下所示:

nm-applet &

但这没什么用,因为一旦终端关闭,在终端中启动的任何进程都会被终止。                                                                        

答案1

我最近开始喜欢上了setsid。它一开始看起来就像你只是在终端上运行某些东西,但你可以断开连接(关闭终端),它就会继续运行。

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

一个例子:

setsid gnome-calculator

我也很喜欢使用disownwhich 来将进程与当前树分开。你可以将它与后台的 & 符号结合使用:

gnome-calculator & disown

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

(gnome-calculator &)

当然还有nohup你提到的。我不太喜欢,因为它有一种在我不要求的情况下自动nohup写入的倾向。如果你依赖它,它可能适合你。~/nohup.out

nohup gnome-calculator

对于长期进程,可以使用screen和其他虚拟终端复用器等工具来保持连接之间的会话处于活动状态。这些可能并不适合您,因为您只想临时访问终端输出,但如果您想回去稍后再查看最新的终端活动,屏幕可能是您的最佳选择。

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

答案2

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

从终端运行

nm-applet &

但不要自己关闭终端。也就是说,不要点击 X 按钮来关闭,也不要从菜单栏中使用文件 -> 退出。如果以这种方式关闭终端,它将向其中运行的 bash 发送 HUP(挂断)信号,而 bash 又会将 HUP 信号发送给其所有子进程(这就是 nohup 在这种情况下起作用的原因)。

exit相反,通过运行或点击Ctrl+退出 shell。bashD将放弃其子进程,然后退出,而后台进程仍在运行。当 bash 退出时,终端已失去其子进程,因此它也会关闭。

一次性完成所有操作:

nm-applet & exit

答案3

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

nohup nm-applet &  

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

答案4

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

相关内容