Answers:
默认情况下,终端将在前台运行程序,因此,直到程序完成后,您才可以回到Shell。这对于从stdin读取和/或写入stdout的程序很有用-您通常不希望其中的许多一次运行。如果要让程序在后台运行,可以这样启动它:
$ lxpanel &
或者,如果它已经在运行,则可以使用Ctrl+ 挂起它,Z然后运行bg
以将其移至后台。无论哪种方式,您都将以新的shell提示结尾,但是程序仍在运行,并且其输出将出现在终端中(因此在您输入时,它可能会突然出现)
一些程序(通常是守护程序)在启动时会分叉一个单独的进程,然后让主进程立即退出。这使程序可以继续运行而不会阻塞您的外壳
默认情况下,通过外壳程序运行的程序在该外壳程序的前台运行。这将导致外壳挂起操作,并将stdin / stdout / sterr从终端定向到程序。通过桌面环境运行的程序是派生的,这使它们独立于运行它们的程序运行。可以在大多数shell中通过将a附加&
到命令上来模拟,尽管这仍将std *连接到终端(尽管从后台程序中的stdin读取会带来更多的复杂性)。
与&的背景很好,除了后来返回的需要稍后控制台交互的程序(例如,“ apt -y update&”最终进入STOP状态,因为它想在更长时间后提示用户“真的真的强制?”问题) ....当没有人观看的时候。
要塞住该漏洞并通知进程,终端实际上永远不会可用,我在某些命令后附加了<&-,将它们与活动终端完全分离,告知不再需要STDIN。 如果使用/ bin / bash,请确保它是您的外壳。 该脚本将继续记录与没有伪终端相关的任何错误,可以在该伪终端上投射任何提示。
例如:
`./runme.sh &> runme.log <&- & disown`
是我脱离当前终端会话的最终方法。STDOUT和STDERR都记录到runme.log中,无论您的控制台或shell提前终止还是您注销/ su到其他帐户(runme都没有终端垃圾)都没有关系,并且还要感谢即使是父子也可以将其拒绝PID关系已删除。
更新:即使这样,我也很难将信号量与原始父母的名字相关联,所以现在我推荐:
at now <<< "(cmd1; cmd2; etc.) &> logfile.log"
当然,如果要通过电子邮件发送CRON的输出,请删除&>,或将其全部重定向到/ dev / null而不是文件。
at now <<< "(cmd1; cmd2; etc.) &> logfile.log"
screen
)可以用来“包装”运行时间更长的进程。您可以从中分离出来,回到外壳程序,然后重新连接并查看正在运行的进程的输出。重新连接甚至可以从另一个终端,SSH等完成。可能还有其他程序可以让您执行这种操作。