如果 shell 脚本运行时间较长,如何使用 nohup?

如果 shell 脚本运行时间较长,如何使用 nohup?

我的 shell 脚本运行时间很长,大约 30 分钟,但如果我离开并出去吃午饭,我对此表示怀疑:

1:如果脚本正在运行,putty会话是否会关闭?

2:如果putty会话关闭,则脚本将退出。

我使用的话nohup scriptname可以嗎?

答案1

PuTTY(或任何其他 SSH 客户端)并不关心您是在看屏幕还是出去吃午饭。它不会自行关闭会话。

仅当出现以下情况时,会话才会关闭:

  1. 您手动关闭它(例如,输入logoutCtrl+ Dexit等等)
  2. 您的 shell 中设置了自动注销或空闲触发器。
  3. 网络连接中断。

后者不应该随机发生,尽管较差的设备可能会在认为连接空闲时“主动”关闭连接。这种情况通常发生在内存很少的 SOHO 设备上,当它们猜测不再使用连接时会主动关闭连接。


到目前为止,我们已经了解了 puTTY 和会话。至于nohup,让我们更深入地了解一下。

早期人们使用电话线和调制解调器拨号。有时这种连接会中断。在这种情况下,shell 会收到线路检测到挂断的信号。(信号 1,HUP)。

当发生这种情况时,shell 会向正在运行的程序发出 SIGHUP 信号,其基本含义是“电话线断了。请正常关机。(关闭文件、必要时保存等)。

当您注销或 puTTY (ssh) 死亡时,也会发生同样的情况。

如果你运行一个程序,nohup那么会发生两件事:

  1. SIGHUP 被忽略。因此程序不会关闭。
  2. 标准输出被写入文件(默认值:)nohup.out而不是 TTY。

我使用的话nohup scriptname可以嗎?

如果您使用nohup scriptname并且脚本不需要任何输入,那么可以。如果您想在脚本运行时查看其输出,可以 tail 日志文件。

nohup scriptname &
tail -f nohup.out

除此之外,nohup至少还有另外两个有趣的选择:

两者不仅可以让您在线路断开的情况下继续工作,还可以稍后重新连接终端。

例子:

坐在计算机-1 后面,登录服务器-1

screen                         开始屏幕
make bzimage                   您想要的任何任务/脚本
Ctrl+ A, Ctrl+D             分离;screen似乎已经结束
logout                         注销

此时screen仍在运行并为您的脚本提供shell。

假设你回到家,坐在自己的电脑前,通过 ssh 连接到 server-1,

ssh server-1.work.tld
  用户名
  密码
screen -r                      (继续之前添加的屏幕)
   ︙                           继续您上次中断的工作。

相关内容