1.SSH断开时进程终止的原因
SSH(Secure Shell)是一种通过命令行远程访问其他系统的协议。当我们通过SSH登录远程服务器并执行命令时,系统会创建一个伪终端(pseudo-terminal)并连接到登录shell。
当我们主动退出会话或因闲置超时导致会话断开时,系统会向伪终端发送SIGHUP(挂起)信号。这个信号会终止所有在该终端中运行的进程,包括那些由父进程在伪终端中启动的子进程。只有配置为忽略此信号的进程才能在会话终止后幸存。
2.Linux进程类型与SSH会话的关系
(1)普通进程
普通进程的生命周期与会话绑定。它们作为前台进程在会话中启动,并在特定时间结束或随会话退出而终止。
(2) 孤儿进程
当父进程意外崩溃或终止后,其子进程会被init进程接管,成为孤儿进程。这些进程在后台继续运行,直到自然结束。
(3)守护进程
这是一种有意创建的孤儿进程。它们启动后便脱离控制终端,在后台长期运行,直到完成任务或出错退出。这正是我们在SSH断开后希望进程保持的状态。
3.五种保持SSH会话运行的技术
3.1使用screen命令
screen是一个文本窗口管理器,允许多终端会话管理、会话切换和随时恢复。
基本操作:
# 启动新会话
$ screen
# 分离当前会话(快捷键Ctrl+a d)
[会话中按Ctrl+a,然后按d]
# 重新连接会话
$ screen -r # 单个会话时
$ screen -r <pid.tty.host> # 多个会话时指定
优点: 会话可随时分离和恢复,支持多窗口管理。
3.2使用tmux终端复用器
tmux是screen的增强替代品,支持水平/垂直分割窗格、调整窗格大小、会话监控等高级功能。
基本操作:
# 启动新会话
$ tmux
# 分离会话
$ tmux detach # 或快捷键Ctrl+b d
# 重新连接
$ tmux attach
优势: 功能比screen更强大,已成为许多Unix发行版的标准工具。
3.3使用nohup命令
nohup让进程忽略SIGHUP信号,适合不熟悉screen/tmux的用户。
# 在后台运行命令并忽略挂起信号
$ nohup find / -type f > files.out 2>&1 &
# 重新登录后查看进程
$ jobs
$ fg %JOBID # 将作业调至前台
注意: 输出默认重定向到nohup.out文件。
3.4使用disown命令
disown将作业从系统作业列表中移除,使其不会在会话断开时收到SIGHUP信号。
# 示例:后台运行ping命令
$ ping example.com > ping.out &
$ jobs -l # 查看作业ID
$ disown -h %1 # 从作业列表移除第一个作业
# 验证进程是否仍在运行
$ ps -ef | grep ping
限制: 不适合需要stdin/stdout交互的进程,除非提前重定向输入输出。
3.5使用setsid命令
setsid为新进程分配独立的进程组,提供比nohup更好的隔离性。
# 在新进程组中运行命令
$ setsid sleep 10m
# 验证进程状态
$ ps -ef | grep sleep
优势: 进程完全脱离控制终端,即使在同一会话中按Ctrl+C也不会受影响。
4.五种方法对比
5.实践建议
日常运维推荐:优先使用tmux或screen,特别是需要管理多个任务或长时间运行交互式进程时。
简单脚本任务:使用nohup或setsid,配合输出重定向(> file 2>&1)。
紧急情况:对已运行的进程使用disown挽救。
生产环境:考虑使用系统服务(systemd)或进程监控工具(supervisor)进行更专业的管理。
6.注意事项
[root@backup ~]# ps auxf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S 2025 0:02 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 2025 0:00 \_ [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 2025 0:17 \_ [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 2025 0:00 \_ [migration/0]
root 8 0.0 0.0 0 0 ? S 2025 0:00 \_ [rcu_bh]
root 9 0.0 0.0 0 0 ? R 2025 2:54 \_ [rcu_sched]
root 10 0.0 0.0 0 0 ? S< 2025 0:00 \_ [lru-add-drain]
root 11 0.0 0.0 0 0 ? S 2025 0:18 \_ [watchdog/0]
root 12 0.0 0.0 0 0 ? S 2025 0:17 \_ [watchdog/1]
root 13 0.0 0.0 0 0 ? S 2025 0:00 \_ [migration/1]
root 14 0.0 0.0 0 0 ? S 2025 0:00 \_ [ksoftirqd/1]
root 16 0.0 0.0 0 0 ? S< 2025 0:00 \_ [kworker/1:0H]
root 17 0.0 0.0 0 0 ? S 2025 0:17 \_ [watchdog/2]
root 18 0.0 0.0 0 0 ? S 2025 0:00 \_ [migration/2]
root 19 0.0 0.0 0 0 ? S 2025 0:00 \_ [ksoftirqd/2]
root 21 0.0 0.0 0 0 ? S< 2025 0:00 \_ [kworker/2:0H]
root 22 0.0 0.0 0 0 ? S 2025 0:16 \_ [watchdog/3]
……
通过合理选择这些工具,你可以确保SSH断开后关键任务持续运行,避免因网络波动或客户端问题导致工作中断。