一、进程状态详解¶
在 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+Z、bg 与 fg¶
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会更合适。