Answers:
最好的方法是在终端多路复用器中启动该过程。或者,您可以使进程不接收HUP信号。
一个终端复用器提供了运行独立于“真实”终端(实际上今天所有的终端都是“虚拟”但这是另一天另一个话题)“虚拟”终端。即使您的真实终端已通过ssh会话关闭,虚拟终端仍将继续运行。
从虚拟终端启动的所有进程将继续与该虚拟终端一起运行。当您重新连接到服务器时,您可以重新连接到虚拟终端,并且除了经过的时间之外,其他一切似乎都没有发生。
屏幕具有陡峭的学习曲线。这是一个很好的教程,其中包含说明概念的图表:http : //www.ibm.com/developerworks/aix/library/au-gnu_screen/
的HUP信号(或SIGHUP)由端子发送到其所有的子进程,当终端关闭发送。收到SIGHUP后的常见操作是终止。因此,当ssh会话断开连接时,所有进程将终止。为避免这种情况,您可以使您的进程不接收SIGHUP。
有关如何工作的更多信息nohup
,请disown
阅读以下问题和答案:https : //unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and
注意:尽管进程将继续运行,但是您将无法与它们进行交互,因为它们不再连接到任何终端。此方法主要用于长时间运行的批处理过程,该过程一旦启动就不再需要任何用户输入。
有几种方法可以做到这一点,但是我发现最有用的一种方法是使用GNU Screen。
ssh进入后,运行screen
。这将启动另一个在屏幕上运行的外壳程序。运行您的命令,然后执行Ctrl- a d。
这将使您与屏幕会话“断开连接”。此时,您可以注销或执行其他任何操作。
当您想重新连接到屏幕会话时,只需screen -RD
在shell提示符下运行即可(与创建会话的用户相同)。
在中bash
,disown
关键字非常适合此操作。首先,在后台运行您的进程(使用&
或^Z
输入bg
):
$ wget --quiet http://server/some_big_file.zip &
[1] 1156
通过键入jobs
您可以看到该进程仍归外壳所有:
$ jobs
[1]+ Running wget
如果此时要注销,则后台任务也将被杀死。但是,如果您运行disown
,bash会分离该作业并允许其继续运行:
$ disown
您可以确认以下内容:
$ jobs
$ logout
您甚至可以在同一行上结合&
和disown
,例如:
$ wget --quiet http://server/some_big_file.zip & disown
$ logout
nohup
在我看来,这比运行更好,因为它不会使nohup.out
文件遍布整个文件系统。另外,nohup
必须在运行命令之前运行- disown
如果仅在以后决定要后台和分离任务,则可以使用此命令。
大多数Linux机器上都提供的工具nohup可以做到这一点。
为了更全面,我将指出tmux,它与screen具有相同的基本思想:
tmux旨在成为BSD许可的现代替代程序,例如GNU屏幕。主要功能包括:
- 一个功能强大,一致,文档完善且易于编写脚本的命令界面。
- 窗口可以水平和垂直拆分为窗格。
- 窗格可以自由移动和调整大小,或按预设布局排列。
- 支持UTF-8和256色终端。
- 复制并粘贴多个缓冲区。
- 用于选择窗口,会话或客户端的交互式菜单。
- 通过在目标中搜索文本来更改当前窗口。
- 终端锁定,手动或超时后。
- 正在积极开发中的,易于扩展的,干净的,BSD许可的代码库。
但是,在Google上搜索几乎无限地容易。
"gnu screen"
您的搜索查询工作得很好。
屏幕过于简单,仅在注销时保持进程运行。
尝试dtach:
dtach是用C编写的程序,它模仿屏幕的分离功能,该程序允许在不受控制终端保护的环境中执行该程序。例如,在dtach控制下的程序不会由于某些原因而断开终端的连接。
之所以写dtach是因为屏幕无法充分满足我的需求;我不需要屏幕的其他功能,例如支持多个终端或终端仿真支持。屏幕也太大,笨重,并且源代码很难理解。
屏幕也干扰了我对全屏应用程序(例如emacs和ircII)的使用,因为它过多地解释了程序与连接的终端之间的流。dtach没有终端仿真层,并将程序的原始输出流传递到连接的终端。dtach唯一执行的输入处理是扫描分离字符(这表明dtach从程序中分离)并处理暂停键(告诉dtach暂时暂停其自身而不影响正在运行的程序),这两者都可以如果需要,请禁用。
与屏幕相反,dtach具有最少的功能,并且非常小。这使dtach可以更容易地进行审计,以检查是否有错误和安全漏洞,并使其在空间有限的环境(例如急救盘)中可以访问。
这是守护所有shell进程的方法,不需要任何外部程序:
( while sleep 5; do date; done ) <&- >output.txt &
然后,当您关闭会话时,该作业将继续运行,如output.txt文件所示(该文件具有缓冲,因此需要一段时间才能显示为非零)。测试后不要忘了杀死你的工作。
因此,您需要做的就是关闭stdin并完成工作。首先,要真正成为一个好人,cd /
请不要紧握坐骑。
即使在Solaris下的简单sh中也可以使用。
-
操作员?< /dev/null
和之间有什么区别&-
?我想可以为STDIN(以及其他STDOUT和STDERR)分配一个文件< file
,或者<& stream
在STDIN的情况下分配一个流。< /dev/null
在上面的示例中使用的方法是否相同?-
上面的运算符是否将null称为流?
screen
为您提供了更多选择,但是,如果您正在使用authorized_keys
允许人们通过远程运行脚本ssh
,则该nohup
选项是脚本启动进程的一种简单方法,其持续时间比ssh
用于启动它们的会话更长。