我正在服务器上运行命令。它带有这个库http://www.graphicsmagick.org/。
基本上我有一个 for 循环,可以对很多文件进行图像处理。
命令运行了几个小时,并且将运行几个小时。我想知道,我可以退出 ssh 并仍然在远程机器上运行这些命令吗?退出 ssh 是否会发送一些信号来结束当前命令的执行?
我注意到的另一件事......虽然我正在远程运行命令,但我的笔记本电脑过热。活动监视器显示 bash 正在使用 70% 的 cpu。我用的是 MacBook Pro
现在这很奇怪。远程命令如何对本地计算机造成压力?
答案1
一种解决方案是在命令前面加上nohup
.这告诉计算机忽略“挂断”信号(例如退出 ssh 会话)。这可能不适用于for
循环。
另一个好的解决方案(也是我个人最喜欢的方法)是安装“screen”包。screen
提供一个虚拟终端,可以通过按 断开连接,使进程保持运行CTRL + A , D
。稍后可以使用 重新连接屏幕screen -r
。
答案2
当具有关联控制终端(在您的情况下)的会话领导者bash
退出时,操作系统会向前台进程组(前台作业)中的所有进程发送 SIGHUP。此外,bash
默认情况下,将 SIGHUP 发送到其所有正在运行或已停止的作业(已停止的作业也会发送 SIGCONT)。现在,收到 SIGHUP 后的默认操作是进程终止。
有几种方法可以让进程在bash
退出后继续运行。首先,你可以让你的进程免受 SIGHUP 的影响;这就是该nohup
命令的作用。其次,可以将相应的进程组后台化,并指示bash
不要向其发送SIGHUP;这就是disown
shell 内置函数的用途(另请注意,有一个huponexit
shell 选项,当交互式登录 shell 退出时,该选项会导致将 SIGHUP 发送到所有作业)。
如果您希望在再次登录后将终端重新连接到进程组,您可能需要使用具有此功能的包装器;终端多路复用器等screen
具有此功能。