Linux screen后台运行任务
当你在 Linux 上跑一个耗时几小时的备份或数据处理脚本,最怕 SSH 一断任务就没了。
screen 就是用来解决这个问题的:它创建一个虚拟终端会话,即使你退出登录,里面的任务依然在后台跑。
下面从零开始,一步步教你用 screen 让长时间脚本稳稳运行。
先确认系统里有没有 screen
大多数 Linux 发行版默认没装 screen,先检查一下。
screen --version
如果提示 command not found,按你的系统安装:
- Debian/Ubuntu:
sudo apt update && sudo apt install screen -y - CentOS/RHEL:
sudo yum install screen -y - AlmaLinux/Rocky:
sudo dnf install screen -y
装完再次执行 screen --version,能看到版本号就说明可用了。
这一步是整个流程的前提,没有 screen 后面都无从谈起。
创建会话并让脚本跑起来
核心操作只有三步:新建会话、运行命令、分离会话。
- 新建一个名为
backup的会话:
screen -S backup
执行后终端看起来没变化,但你已经进入了一个新的虚拟窗口。
- 在里面正常启动你的脚本,例如:
bash /home/user/long_task.sh
- 按下
Ctrl + A,松开后再按D。这时屏幕会提示[detached],表示会话已退到后台,脚本继续运行。
以后要重新查看,执行:
screen -r backup
如果记不住会话名,用 screen -ls 列出所有会话,再用 screen -r 会话ID 恢复。只要会话没被主动 kill,里面的进程就不会因为终端关闭而终止。
断网或误关终端后怎么恢复
SSH 断开后重新登录,先看会话还在不在:
screen -ls
输出里会显示类似 12345.backup (Detached) 的行。
状态是 Detached 说明脚本仍在后台跑。
恢复命令:
screen -r 12345
如果提示 There is no screen to be resumed,可能是会话已结束,或者你用了错误的会话名。
此时用 screen -ls 确认实际存在的会话。
还有一种情况:会话状态显示 Attached,通常是因为另一个终端还连着。
可以强制接管:
screen -d -r 12345
几个容易踩的坑
- 不要在 screen 里再套 screen,容易出现按键冲突,恢复时不知道进的是哪一层。
- 脚本输出太多会占满磁盘,建议在脚本里重定向日志,例如
bash long_task.sh > /var/log/task.log 2>&1。 - 直接关终端不等于安全退出,务必用
Ctrl + A然后D分离,而不是直接叉掉窗口。 - 服务器重启后 screen 会话会丢失,如果需要开机自启,要配合 systemd 或 cron,screen 本身不负责这个。
- 多人共用账号时注意会话命名,用
screen -S 项目名避免互相干扰。
怎么确认任务真的在跑
分离会话后,可以这样验证:
screen -ls
ps aux | grep long_task.sh
screen -ls 能看到会话存在,ps aux 能看到脚本进程,两者都正常就说明任务没断。
如果想看实时输出,恢复会话即可。
任务跑完后,在 screen 窗口里输入 exit,或者按 Ctrl + A 再按 K 然后确认,会话就会关闭。
常见疑问
screen 和 nohup 有什么区别?
nohup 适合一次性命令,输出重定向到文件;
screen 更适合需要交互或中途查看输出的长时间任务,恢复后能继续操作。
screen 会话能保持多久?
只要服务器不重启、会话不被手动结束,就可以一直保持。
具体时长取决于系统资源和是否有清理策略,建议以实际环境为准。
能不能在 screen 里跑图形界面程序?
可以,但通常需要配合 X11 转发,纯命令行脚本用不到。
如果 screen 命令突然没反应怎么办?
先尝试 Ctrl + A 然后 D 分离,再重新 screen -r 恢复。
如果还是卡住,用 screen -ls 找到会话 ID 后 screen -X -S 会话ID quit 强制结束。
掌握 screen 后,长时间脚本不中断就不再是难题。
建议先在测试环境跑一遍完整流程,确认恢复和验证步骤都符合预期,再放到生产环境使用。