欢迎光临
我们一直在努力

SSH断开后任务停止?tmux使用教程

通过SSH连接Linux服务器后,执行文件下载、数据处理或较长时间的维护任务,是很常见的操作。

但如果电脑休眠、网络中断,或者关闭了SSH窗口,直接运行在终端中的程序可能随会话结束而退出,具体表现与程序及系统配置有关。

使用tmux,可以先创建一个保留在服务器上的终端会话,在里面运行任务。暂时离开时分离会话,之后重新连接服务器,再接回原来的操作界面。

本文以Debian、Ubuntu为例,介绍从安装到重新接入的完整流程,适用于莱卡云Linux云服务器及常见Linux服务器环境。

1. tmux适合解决什么问题?

tmux是一款终端复用工具。对于刚开始使用的用户,可以先掌握两个功能:

  • 分离会话: 暂时离开操作界面,让会话中的程序继续运行。
  • 重新接入: 再次登录服务器后,回到原来的终端界面。

它比较适合以下场景:

  • 执行需要较长时间的下载或文件处理。
  • 运行临时维护脚本。
  • 需要稍后回来查看结果的命令行操作。
  • 在不同SSH连接之间继续同一项工作。

使用时要注意顺序:先进入tmux,再启动任务。

tmux会话能够在客户端断开后继续存在,但服务器重启、程序自身退出或系统清理进程,仍然可能终止任务。

2. 在服务器上安装tmux

先通过SSH登录服务器。

下文的安装、创建会话和恢复会话命令,都在登录后的服务器终端中执行。创建和恢复会话时,应使用同一个系统用户。

Debian、Ubuntu可以执行:

sudo apt-get update
sudo apt-get install -y tmux

如果使用root登录,可以去掉命令开头的sudo。通过系统软件包管理器安装,也是tmux官方提供的安装方式之一。

安装后检查:

tmux -V

能够显示版本号,说明已经可以调用tmux。

普通使用不需要额外开放公网端口,继续通过原来的SSH连接操作即可。

3. 创建会话,运行一个简单测试

创建名为work的会话:

tmux new -s work

其中,work是会话名称,可以换成容易识别的名字,例如backup或download。

进入后,终端底部通常会出现tmux状态栏。

为了先验证操作流程,可以运行下面的测试命令:

while true; do
    date '+%F %T'
    sleep 5
done

这条命令每隔约5秒输出一次服务器时间,不会修改业务文件。

看到时间持续输出后,先不要按Ctrl+C,继续进行下一节的分离测试。

4. 分离会话,重新登录后接回

第一步:分离当前会话

按下面的顺序操作:

  1. 同时按下Ctrl+B。
  2. 松开两个按键。
  3. 再按小写d,不用按Shift。

这里不是同时按三个键。

使用默认配置时,终端通常会显示:

[detached (from session work)]

随后返回外层SSH终端。此时只是离开tmux界面,里面的测试循环仍可继续运行。

第二步:断开并重新连接SSH

确认已经回到外层SSH提示符后,执行:

exit

这一步用于退出当前SSH连接。

等待约20秒,再通过原来的SSH客户端,使用同一个用户登录同一台服务器。

第三步:查看并接入会话

先查看会话列表:

tmux ls

如果列表中仍有work,执行:

tmux attach -t work

这会接入已有会话,而不是重新运行一份任务。

正常情况下,你会回到刚才的测试界面,并看到分离期间产生的时间记录。

确认后按Ctrl+C停止测试循环,保留当前tmux会话供后续使用。

tmux创建会话、分离会话和重新接入操作流程

5. 在tmux中运行实际任务

完成测试后,就可以在当前tmux会话里执行自己的任务。

假设脚本位于/opt/myjob/run.sh,可以执行:

cd /opt/myjob && /bin/bash ./run.sh

这里的目录和脚本名是示例,需要替换为实际路径。

先进入项目目录,可以让脚本中的相对路径按预期工作;使用&&连接两条命令,则表示只有成功进入目录后才运行脚本。

任务开始后,仍然使用:

Ctrl+B → 松开 → 小写d

分离会话,之后再通过tmux attach -t work接回。

需要保留日志时怎么做?

需要保存输出时,用下面这条命令替代上面的启动命令:

cd /opt/myjob && /bin/bash ./run.sh >> run.log 2>&1

它会把正常输出和错误输出追加到项目目录中的run.log。执行用户需要有相应的写入权限。

这时终端可能没有持续显示内容,因为输出已经写入日志。

可以另开一个SSH连接查看:

tail -n 50 /opt/myjob/run.log

对于需要保留运行记录的任务,建议使用日志文件。tmux的屏幕历史记录有容量限制,不能代替完整的业务日志。

6. 任务完成后,怎样结束会话?

分离会话和结束会话是两种不同操作。

操作作用
Ctrl+B,松开后按小写d离开界面,保留会话
tmux attach -t work接回名为work的会话
Ctrl+C中断当前前台程序,本文用它停止测试循环
在会话的Shell提示符下输入exit退出当前Shell

实际业务任务应按照程序自身支持的方式正常结束。确认任务已经完成、终端回到命令提示符后,可以执行:

exit

对于本文创建的单窗口、单窗格会话,退出其中的Shell后,会话通常也随之结束。

如果以后创建了多个窗口或窗格,退出其中一个,不代表整个会话都已经关闭。

任务完成时,还应核对实际结果,例如文件是否生成、数据是否处理完成,以及日志中是否存在错误。

7. 常见问题怎么处理?

提示duplicate session怎么办?

如果创建会话时出现:

duplicate session: work

说明同名会话已经存在。

先执行tmux ls查看,再使用tmux attach -t work接入。确实需要另一项独立任务时,可以使用新的会话名称。

重新登录后,找不到原来的会话怎么办?

先检查:

  • 是否登录了同一台服务器。
  • 是否使用了创建会话时的同一个用户。
  • 是否曾经通过sudo tmux创建会话,后来却以普通用户查找。
  • 服务器是否重启过,或者会话已经被结束。

tmux默认按用户使用独立的套接字目录,因此切换用户后,不能直接假定会看到原来的会话。

如果每次退出SSH后会话都会消失,还需要检查系统的登出清理策略。例如,systemd的KillUserProcesses=yes可能结束登录会话范围内的进程,从而影响tmux。

这种情况应结合服务器实际配置处理,不能仅凭安装了tmux就认为任务一定能够保留。

已经在普通终端运行的任务,会自动进入tmux吗?

不会。

新建tmux会话,不会自动接管其他终端里已经运行的程序。

可以等待原任务完成,或者在确认能够安全停止后,再从tmux中重新启动。涉及数据导入、迁移等操作时,应先确认任务状态,避免重复执行。

8. 结语

使用tmux保持远程任务,核心流程是:

创建会话 → 在会话中启动任务 → 分离会话 → 重新登录 → 接入原会话。

对于临时维护、文件处理和需要随时回来查看的命令行任务,这种方式比较方便。执行过程中保留日志,结束后核对业务结果,能让远程维护更容易追踪。

如果程序需要长期运行,并要求开机启动或失败后自动重启,应使用适合的服务管理方式,可以参考本站的Linux 程序手动运行正常,systemd 启动失败怎么办?

如果任务需要每天或每隔一段时间自动执行,可以继续阅读Linux定时任务不执行怎么办?Cron常见问题排查

在莱卡云Linux云服务器上,根据任务类型选择tmux、systemd或Cron,并做好运行记录,可以让日常运维更有条理。

查看官网购买链接: https://www.lcayun.com

9折优惠码:bloglcayun

赞(0)
未经允许不得转载:莱卡云 » SSH断开后任务停止?tmux使用教程