SSH关闭Liunx系统正常运行

[复制链接]
发表于 2026-10-3 14:20:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

SSH 断了命令也别断:screen 与 nohup 保住后台任务

在 Linux 上跑耗时长的任务(编译、训练、大数据导入),最怕的就是断开 SSH 或关掉终端客户端,命令随着 SIGHUP 一起被杀,前面跑了几小时白干。这篇给两种解法:screen 会把会话整体挂在后台,回来能接着看输出;nohup 只让进程忽略挂起信号,简单粗暴。

一、为什么断开 SSH 命令会停

终端会话断开时,内核会给该会话前台进程组发送 SIGHUP(hangup)信号。SSH 客户端一关,这个信号就到了,进程默认动作是直接终止。所以要么让进程忽略这个信号(nohup),要么把进程塞进一个不受会话生命周期影响的会话管理器(screen / tmux)。

二、用 screen 托管长任务

GNU Screen 可以理解为命令行里的窗口管理器:只要 screen 本身没退出,它内部跑的会话就能恢复回来,特别适合长时间运行的任务。

1. 安装

CentOS 系默认没装:

[root@host ~]# yum install screen
...
Installed:
  screen.x86_64 0:4.6.2-12.el8

Complete!

Ubuntu / Debian 对应 sudo apt install screen。

2. 创建会话

screen -S myblog

回车后进入一个新窗口,命令行提示符变了就是进去了。如果之前已经有个同名会话,用 screen -r myblog 直接恢复。

3. 在会话里跑任务

需要跑脚本或起服务,命令前面加 screen 即可:

screen npm run docs:dev

4. 挂起会话、退出登录

同时按 Ctrl + A 然后按 D, screen 会 detach 回原始终端,你就能退出 SSH 了,里面的程序照常跑。

5. 回来恢复

重新登录服务器,执行:

screen -r -d

常用管理命令:screen -ls 列所有会话,screen -r 会话名 恢复,机器上会话多了记得起名字,别用默认的 pts-0 之类分不清谁是谁。

三、用 nohup 让进程无视挂起信号

nohup 的作用是让命令忽略 SIGHUP。通常配合结尾的 & 把它丢到后台。完整写法是:命令前加 nohup、结尾加 &:

[root@host project]# nohup npm run docs:dev &
[1] 35432

终端会回一个作业号 [1] 和 PID 35432。这时输出被重定向到当前目录的 nohup.out,回车就跳回 shell,进程在后台继续跑。

两个配套用法:

  • 实时看输出:tail -f nohup.out(想指定自己的日志日志文件就 nohup command > my.log 2>& &)
  • 结束进程:kill -TERM 35432,PID 就是上面输出的那个

四、两种方案怎么选

  • 要交互式继续操作、要回看历史输出 → screen / tmux,回来能接着敲命令,输出还在窗口里。
  • 只是让一个脚本安静跑完、不需要交互 → nohup + &,一条命令的事。
  • 生产环境更推荐 systemd service:有重启策略、有日志日志(journalctl -u 服务名)、能设资源限制,比 screen 稳得多。

五、几个容易踩的点

  • nohup 拼错成 nohub,命令会报 "command not found",别照抄笔误。
  • nohup 默认写 nohup.out,多个任务挤在同一目录会互相覆盖,记得重定向到自己的文件。
  • screen 会话留在机器上没人管会一直占资源,任务跑完记得 screen -S 名字 -X quit 关掉。
  • 用 setsid 也能让进程脱离当前会话,属于第三种思路,需要完全脱胎换骨时用。

一句话总结:交互场景用 screen/tmux,纯后台用 nohup,长期服务交给 systemd。别再让断线吞掉你跑了两小时的编译了。

qidao123.com企服评测-应用市场 编辑提示

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表