我对Linux真的很陌生(就像本周早些时候我刚开始的时候一样)所以如果这是一个非常简单的问题,请原谅我。我正在远程服务器上运行一个程序,这是一个处理数百 GB 数据的漫长过程,因此我想让它运行过夜。长话短说,我通过 ssh 登录,启动程序,观察它是否正在运行,然后关闭终端。今天早上我回来看到它完全停在我前一天晚上终止 ssh 时的位置。当我关闭时,有没有办法让进程在服务器上保持运行?
答案1
正如其他答案所暗示的那样。您可以使用nohup <command> &
。
您还可以使用screen
,这(基本上)是一个可拆卸的终端。您可以使用该命令启动终端screen
,并在想要与之分离时启动终端。 Ctrl+ad。并重新连接您的终端运行screen -r <terminal_name>
。如果您有多个分离终端,您可以使用该命令screen -r
查看分离终端的名称。
Screen 是一个全屏窗口管理器,它在多个进程(通常是交互式 shell)之间复用物理终端。每个虚拟终端都提供 DEC VT100 终端的功能,此外还提供 ISO 6429(ECMA 48、ANSI X3.64)和 ISO 2022 标准的多种控制功能(例如插入/删除行和支持多个字符集)。每个虚拟终端都有一个回滚历史缓冲区,以及允许在窗口之间移动文本区域的复制粘贴机制。
编辑:
您也可以使用tmux
.看一看这里了解基本的“如何使用tmux
”。
tmux
是终端复用器。什么是终端多路复用器?它可以让您轻松地在一个终端中的多个程序之间切换、分离它们(它们在后台继续运行)并将它们重新连接到不同的终端。并做更多事情。
答案2
您想要的命令称为nohup
。基本语法是:
nohup <command>
这将运行<command>
并强制忽略 SIGHUP(当控制终端关闭时发送到进程的信号,例如当父 SSH 会话结束时)。请注意,在基于 Systemd 的系统上可以阻止此操作,但据我所知,默认情况下没有使用此类配置的发行版。
或者,检查该命令是否at
存在并且atd
正在运行。如果都是这种情况,您可以告诉系统将脚本作为批处理作业运行,甚至可以使用以下命令通过电子邮件将输出发送给您:
at "`date +%FT%T`" << EOF
<command>
EOF
您可以将双引号的内容替换为任何合理的日期和时间规范(at
足够智能,可以处理合理的人类可读内容,例如“明天上午 8 点”或“下周日”),但给定的命令将立即启动作业(日期命令将返回当前日期和时间(ISO 8601 时间戳)。
答案3
通过 SSH 登录到您的服务器并运行:
nohup YOUR_PROGRAM &
这将在后台运行您的程序,并且如果您的 SSH 会话断开连接并停止您正在使用的 shell,则运行进程不会停止。
查看这个线程有关nohup
和 的详细信息&
。
答案4
nohup
在这种情况下您可以使用。
尝试
$ nohup ./YourExecutableFile &
这将运行您的可执行文件并将其放在后台,即使您注销它也不会停止。