一、进程状态详解

在 Linux 中,进程会处于不同状态。通常可以理解为:基本状态 + 附加标记

1.1 STAT 基本状态

STAT 基本状态 描述
R 运行中(running)
S 可中断睡眠状态
T 被暂停或挂起,例如按下 Ctrl+Z
D 不可中断睡眠,常见于 IO 等待
Z 僵尸进程

1.2 STAT 附加标记

标记 描述
s 会话首进程或控制进程
< 高优先级进程
N 低优先级进程
+ 当前在前台进程组中运行
l 多线程进程

1.3 常见状态组合

状态组合 说明
R+ 前台运行中的进程
R 后台运行中的进程
S 大部分普通可中断进程
T 被挂起的进程
D 不可中断进程,常见于 IO
Ss 管理类或会话类进程
S< 高优先级的可中断进程
Ssl 多线程的管理进程
Z 僵尸进程

二、什么是前台和后台程序

2.1 前台程序

前台程序直接在当前终端中运行,会占用终端并向终端输出信息,通常也会等待用户输入。如果终端关闭,这类程序通常也会退出。

2.2 后台程序

后台程序在后台运行,不直接占用当前终端窗口,通常不需要持续与用户交互。可以使用 jobs 查看当前终端里管理的后台作业,也可以用 ps 查看系统中的全部后台进程。

2.3 二者区别

从使用体验上看:

  • 前台程序更适合交互式操作。
  • 后台程序更适合长时间运行的任务。
  • 很多服务类程序都适合放到后台执行。

三、软件后台运行方法

原始笔记中总结了四种常见后台运行方法:

软件后台运行方法 说明 应用场景
命令 & 最常用的后台运行方法 大部分临时后台任务
nohup 命令 & & 类似,但会记录输出 希望保留输出日志
先运行命令,再按 Ctrl+Z,然后执行 bg 让当前前台任务进入后台 临时把正在运行的程序切到后台
screen 通过虚拟会话运行命令,更稳定 长连接、远程会话中长期任务

3.1 使用 &

sleep 999 后台运行:

$ sleep 999 &
[1] 21611

查看进程:

$ ps aux | grep 21611

root      21611  0.0  0.0 108052   352 pts/0    S    22:03   0:00 sleep 999
root      21613  0.0  0.0 112808   960 pts/0    S+   22:04   0:00 grep --color=auto 21611

使用 jobs 查看当前 Shell 中的后台作业:

$ jobs
[1]+  Running                 sleep 999 &

3.2 使用 nohup 命令 &

nohup 可以让命令在终端关闭后继续运行,并把输出保留到文件中,默认文件名通常是 nohup.out

ping baidu.com 后台运行并记录输出:

$ nohup ping -c 2 baidu.com &

查看 nohup.out

$ tail -2 nohup.out

2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 29.507/38.125/46.743/8.618 ms

3.3 使用 Ctrl+Zbgfg

  • Ctrl+Z:把当前前台任务挂起
  • bg:让挂起任务转到后台继续运行
  • fg:把后台或挂起任务重新切回前台

这组命令在临时调整任务运行方式时非常实用。比如有些命令一开始以前台运行,后来想把它放到后台,此时就可以使用 Ctrl+Z 后接 bg

3.4 使用 screen

当使用 &nohup 还觉得不够稳定时,可以考虑 screen。它通过独立会话承载命令,即使网络中断或终端关闭,也更容易恢复。

安装 screen

$ yum install -y screen

启动 screen 会话:

$ screen

在会话中执行命令,例如:

$ ping baidu.com

分离会话时,通常使用快捷键 Ctrl+A,然后按 d

查看当前系统中的 Screen 会话:

$ screen -ls

There is a screen on:
        21649.pts-0.k8s-master01        (Detached)
1 Socket in /var/run/screen/S-root.

重新附加到会话:

$ screen -r 21649.pts-0.k8s-master01

重新查看会话状态时,可能会看到 Attached,表示当前已经重新接管该会话。

四、小结

前后台管理的核心不是死记命令,而是理解运行方式:

  • 想快速后台运行,优先用 &
  • 想保留输出并尽量不受终端影响,优先用 nohup
  • 想临时把前台任务切到后台,就用 Ctrl+Z 配合 bg / fg
  • 想长期稳定地托管命令,screen 会更合适。