我有一个 AWS 实例,我需要完成一些任务,这需要一些时间。
如果我在上下班途中运行这些程序(例如wget <someStuff>
),然后将其提交到后台CtrlZ»bg
以检查它是否正常启动),然后退出我的 SSH 会话,wget 命令会在后台继续执行吗?
或者它会随着我的会话关闭而停止吗?
答案1
仅将其置于后台不会导致它在您退出 ssh 会话后仍留在后台。
在后台运行它只是将stdin
管道与控制台分离。该过程仍然是孩子shell 进程,例如bash
。Linux/UNIX 上的标准程序是,正常终止父 shell 进程会导致所有子进程收到信号SIGHUP
。几乎所有标准进程都会将该信号处理为终止进程的请求,尽管进程能忽略 SIGHUP 信号并继续运行。它也可以做一些完全不同的事情,比如打开你的微波炉,或者让月球车钻入地面,或者启动你的汽车,或者删除系统上的所有文件。这是一个信号,这意味着它只是发送给进程的一种建议命令。进程可以用它做任何想做的事情。
您需要了解的是:由于处理 SIGHUP 相当于说“请立即终止您的程序”,因此某些程序很容易忽略该“好请求”并继续运行。因此,有几个专门设计的程序允许进程在 shell 终止后继续运行。顺便说一句,当您的 SSH 连接断开时,shell 进程做作为您注销序列的一部分终止。
GNUscreen
就是这样一个命令;nohup
是另一个。screen
总体上更灵活,对于这个特定任务非常有用。bg
并不合适,因为如果子进程没有被包装在旨在忽略 SIGHUP 的进程中,例如,它将“尊重” SIGHUP。screen
是nohup
最基本的 SIGHUP 忽略进程,因为除了将子进程的输出写入文件之外,这基本上是它的唯一功能。
另请参见这个问题,它基本上是完全重复的,但是在服务器故障。
答案2
如果您关闭 SSH 会话,Wget 会自动在后台继续运行,无需采取任何进一步的操作。它甚至会创建一个wget-log
文件,就像您使用-b
开关启动它一样。
一般来说,当您关闭 SSH 会话时,已停止或处于后台的程序将退出。