我通过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。
两种简单的方法是nohup
和disown
。
有关nohup
和disown
作品的更多信息,请阅读以下问题和答案: https : //unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and
注意:尽pipe进程将继续运行,但不能再与它们交互,因为它们不再连接到任何terminal。 此方法主要用于长时间运行的批处理,一旦启动,不再需要任何用户input。
有几种方法可以做到这一点,但我觉得最有用的方法是使用GNU屏幕 。
在你ssh之后,运行screen
。 这将启动在屏幕内运行的另一个shell。 运行你的命令,然后做一个Ctrl – a d 。
这将“断开”你的屏幕会话。 在这一点上,你可以注销或做任何你想要的东西。
当你想重新连接到屏幕会话时,只需在shell提示符下运行screen -RD
(与创build会话的用户相同)。
在bash
, disown
关键字完全适合这个。 首先,在后台运行你的进程(使用&
,或^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。