注销后保持linux进程运行

我通过SSH连接到一台Linux机器上,我试图运行一个沉重的bash脚本来执行文件系统操作。 预计将继续运行几个小时,但由于Internet连接问题,我不能离开SSH会话。

我怀疑用后台运算符&符号( & )运行脚本是否会有所斩获,因为我尝试了它,后来发现这个过程还没有完成。 我如何注销并保持进程运行?

最好的方法是在terminal复用器中启动该过程。 或者,您可以使过程不接收HUP信号。


terminal复用器提供独立于“真实”terminal运行的“虚拟”terminal(实际上,今天所有的terminal都是“虚拟的”,但这是另一天的另一个话题)。 即使您的真实terminal用您的ssh会话closures,虚拟terminal也将继续运行。

从虚拟terminal开始的所有进程将继续与该虚拟terminal一起运行。 当你重新连接到服务器,你可以重新连接到虚拟terminal,一切都会像没有发生,除了通过的时间。

两个stream行的terminal多路复用器是屏幕和tmux 。

屏幕有一个陡峭的学习曲线。 这里有一个很好的教程,用图解释了这个概念: http : //www.ibm.com/developerworks/aix/library/au-gnu_screen/


当terminalclosures时, HUP信号(或SIGHUP)由terminal发送到其所有的subprocess。 收到SIGHUP的通用行为是终止。 因此,当你的SSH会话断开连接时,所有的进程将终止。 为了避免这种情况,您可以使您的进程不能收到SIGHUP。

两种简单的方法是nohupdisown

有关nohupdisown作品的更多信息,请阅读以下问题和答案: https : //unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and

注意:尽pipe进程将继续运行,但不能再与它们交互,因为它们不再连接到任何terminal。 此方法主要用于长时间运行的批处理,一旦启动,不再需要任何用户input。

有几种方法可以做到这一点,但我觉得最有用的方法是使用GNU屏幕 。

在你ssh之后,运行screen 。 这将启动在屏幕内运行的另一个shell。 运行你的命令,然后做一个Ctrla d

这将“断开”你的屏幕会话。 在这一点上,你可以注销或做任何你想要的东西。

当你想重新连接到屏幕会话时,只需在shell提示符下运行screen -RD (与创build会话的用户相同)。

bashdisown关键字完全适合这个。 首先,在后台运行你的进程(使用& ,或^Z然后键入bg ):

 $ wget --quiet http://server/some_big_file.zip & [1] 1156 

通过键入jobs您可以看到该进程仍然由shell所拥有:

 $ jobs [1]+ Running wget 

如果你在这个时候注销,后台任务也会被杀死。 但是,如果运行失败,bash将分离该作业并允许其继续运行:

 $ disown 

你可以确认这一点:

 $ jobs $ logout 

你甚至可以把&disown同一行上,如:

 $ wget --quiet http://server/some_big_file.zip & disown $ logout 

这比在我看来运行nohup要好,因为它不会让文件系统上散布的nohup.out文件。 另外,在运行命令之前必须先运行nohup命令 – 如果您以后只是决定后台并分离任务,则可以使用disown

在大多数Linux机器上可以使用的nohup工具可以做到这一点。

只是要彻底,我会指出tmux ,它具有与屏幕相同的基本思想:

tmux旨在成为现代BSD许可的替代程序,如GNU屏幕。 主要function包括:

  • 一个function强大,一致,文档齐全且易于编写脚本的命令界面。
  • 一个窗口可以水平和垂直分割成窗格。
  • 窗格可以自由移动和resize,或者安排到​​预设的布局中。
  • 支持UTF-8和256色terminal。
  • 复制并粘贴多个缓冲区。
  • 交互式菜单来select窗口,会话或客户端。
  • 通过在目标中search文本来更改当前窗口。
  • terminallocking,手动或超时后。
  • 一个干净,容易扩展的BSD许可代码库,正在积极开发之中。

但是,在Google上进行search要容易得多。

屏幕过度消耗只是为了在注销时保持进程运行。

尝试dtach :

dtach是一个用C语言编写的程序,它模拟屏幕的分离function,允许程序在一个与控制terminal隔离的环境中执行。 例如,dtach控制下的程序不会因为某些原因断开terminal而受到影响。

dtach是因为屏幕没有充分满足我的需求而写的; 我不需要屏幕的额外function,如支持多个terminal或terminal仿真支持。 屏幕也太大,笨重,而且源代码很难理解。

屏幕也干扰了我对emacs和ircII等全屏应用程序的使用,因为它对程序和所连接的terminal之间的stream进行了过度的解释。 dtach没有terminal仿真层,并将程序的原始输出stream传递给附加的terminal。 dtach唯一执行的input处理就是扫描分离字符(这个字符指示dtach从程序中分离出来)并且处理暂停键(它告诉dtach暂时挂起而不影响正在运行的程序),而且这两个都可以如果需要禁用。

与屏幕相反,dtach具有最小的特征,而且非常小巧。 这使得dtach可以更容易地检查错误和安全漏洞,并且可以在空间有限的环境(如救援盘)上访问。

这是一个守护进程的方法,不需要外部程序:

 ( while sleep 5; do date; done ) <&- >output.txt & 

当你closures会话时,作业将继续运行,如output.txt文件所示(具有缓冲function,因此需要一段时间才能显示非零值)。 testing之后不要忘记干掉你的工作。

所以你所要做的就是closures标准input和后台工作。 要非常好,先cd /所以你不要坚持一个安装。

这在Solaris下也可以运行。

at命令可以用于这种情况。 例如,键入:

 at now 

然后你可以input一个命令或一系列将要运行的命令。 如果电子邮件在机器上正确设置,结果应通过电子邮件发送给您。

而不是now ,你可以指定一个时间select性的date,或时间expression式,如now + 15 minutes 。 看到man at更多的细节。

Ubuntu上的byobu是一个很好的屏幕前端。 按下Ctrl 你会得到所有键盘快捷键的列表。 它增加了一个状态栏,可以用来监视CPU负载,磁盘空间等。总的来说,它提供了一种我将描述为基于terminal的VNC连接的体验。

nohup允许在后台启动一个作业,并将其输出路由到一个日志文件,如果不需要,可以将其redirect到/ dev / null。