大多数情况下,Screen 会话断开后进程仍在运行,如果你发现失效,通常是因为没有正确分离会话或者 VPS 发生了重启,对于需要长期稳定运行的脚本,更建议改用 Systemd 服务管理。
先说结论:Screen 适合临时保持会话,若要脚本断连后永久存活且开机自启,应迁移至 Systemd 或 Supervisor。
- 适合:临时调试、需要交互查看输出的任务
- 先准备:确认脚本具备后台运行能力,无交互式输入依赖
- 验收:断开 SSH 连接后,再次登录复查进程是否存在
命令速用版
# 正确分离 Screen 会话:先按 Ctrl+A,再按 D
# 重新连接会话
screen -r
# 查看现有会话列表
screen -ls
# 若需开机自启,建议创建 Systemd 服务
systemctl enable your-service_name为什么会这样
Screen 的本质是一个终端复用工具,它设计的初衷是让你在断开 SSH 后保留当前的操作界面,而不是作为一个守护进程管理器。当你直接在 Screen 内部输入 exit 或关闭终端窗口而未分离时,会话可能结束。此外,VPS 重启会清空内存中的所有进程,Screen 会话默认不具备开机自启功能。
部分系统的 PAM 配置可能在用户完全注销时发送信号清理进程,虽然 Screen 通常能抵御这种信号,但依赖它来跑关键业务并不稳妥。
分步处理
1. 检查当前 Screen 状态
登录 VPS,输入 screen -ls 查看是否有存活会话。如果显示 No sockets,说明之前的会话已彻底结束。
2. 规范使用 Screen
进入会话后,不要输入 exit 退出。需要离开时,按下 Ctrl+A 组合键,松开后按 D 键,屏幕会显示 [detached],此时安全断开 SSH 即可。
3. 迁移至 Systemd(推荐)
创建服务文件 /etc/systemd/system/myscript.service,填写 ExecStart 指向你的脚本路径,设置 Restart=always。执行 systemctl daemon-reload 重载配置,再用 systemctl start myscript 启动。
怎么验证是否生效
断开 SSH 连接,等待几分钟后重新登录。使用 ps -ef | grep 脚本名 查看进程是否在运行。如果是 Systemd 管理的服务,使用 systemctl status 服务名 查看状态是否为 active (running)。
检查脚本自身的日志输出,确认没有报错中断。
常见坑
1. 误以为 Screen 能开机自启:VPS 重启后,所有 Screen 会话都会消失,必须配合 crontab @reboot 或 Systemd 才能实现重启后自动运行。
2. 脚本内有交互输入:后台运行的脚本不能包含需要用户键盘输入的指令,否则进程会卡在等待输入状态。
3. 权限问题:确保脚本有执行权限,且 Systemd 服务文件中的用户权限配置正确,避免因权限不足导致启动失败。