马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
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企服评测-应用市场 编辑提示 |