云计算百科
云计算领域专业知识百科平台

Ubuntu Server 入门 12 讲(11):进程与服务 —— 哪一列能信,服务怎么管

文章目录

  • Ubuntu Server 入门 12 讲(11):进程与服务 —— 哪一列能信,服务怎么管
    • 本讲讲什么
    • 11.1 程序与进程,1 号进程
    • 11.2 `ps` 的哪些列会动、哪些不会
    • 11.3 top 前五行与负载
    • 11.4 前后台与作业控制
    • 11.5 结束进程:信号 15 与 9
    • 11.6 优先级:nice 与 renice
    • 11.7 systemd:写一个自己的服务
    • 11.8 `start` 与 `enable` 的区别
    • 11.9 人看 vs 机器读
    • 动手清单
    • 三个容易踩的坑
    • 一句话带走
    • 上一讲回顾
    • 下一讲
    • 系列目录

Ubuntu Server 入门 12 讲(11):进程与服务 —— 哪一列能信,服务怎么管

ps 的难点从来不是语法,是哪一列可以信:输出有十几列,其中 PID、%CPU、TIME、START 每次都在变,而 COMM、NI、UID、PPID 是不动的。分不清这一点,写出来的脚本今天对、明天错。而 systemd 那边还有一条更容易被忽略的事:「现在在不在跑」和「开机自不自启」是两个不同的问题,只问一个就交付,等于没做完。


本讲讲什么

小节
讲什么
读完你能做什么
11.1 程序与进程,1 号进程 进程是什么、谁在管它
11.2 ps 的哪些列会动、哪些不会 只挑稳定的列,写出不会错的脚本
11.3 top 前五行与负载 负载要跟核数比
11.4 前后台与作业控制 &、Ctrl+C、Ctrl+Z 各干什么
11.5 结束进程:信号 15 与 9 先礼后兵
11.6 优先级:nice 与 renice 不抢资源
11.7 systemd:写一个自己的服务 服务能被托管
11.8 start 与 enable 的区别 本讲最要紧的一条
11.9 人看 vs 机器读 status 对人、is-active 对脚本

11.1 程序与进程,1 号进程

一个类比就够:

程序是菜谱,进程是照着菜谱做的那锅菜。

同一个程序跑两次 = 两个进程。所以「nginx 停了」这句话不严谨——是「那些 nginx 进程停了」。这个区分在排查时很要紧:一个进程停了不影响另一个。

内核开机时只亲手起一个进程,PID 是 1,叫 systemd(Ubuntu 上是这样)。其余所有进程的父进程最终都指向它。

ps -p 1 -o pid,comm,args

杀掉 1 号进程等于关机——它一死,内核就没有监护人了。而且普通用户本来就杀不了它。

这一条的实际意义:任何进程顺着 PPID 往上追,最终都会走到 PID 1。这就是为什么「找不到父进程」的问题不会出现——如果某个进程的 PPID 变成了 1,说明它原来的父进程已经退了,它被 init 收养了(孤儿进程)。


11.2 ps 的哪些列会动、哪些不会

这一节是本讲的核心。ps 的输出有十几列,其中一部分每次执行都在变,一部分恒定。

会变的列
不会变的列
PID(进程号,每次都不同) COMM(命令名)
%CPU(瞬间占用) NI(nice 值)
TIME(累计 CPU 时间,一直涨) UID(属主)
START(启动时刻) PPID(父进程号)
VSZ / RSS(内存占用会波动) S(状态,大部分时候稳定)

为什么这个区分如此重要:

# 危险的写法:依赖默认输出
ps aux | grep nginx | awk \'{print $2}\’ | xargs kill

上面这条在大多数时候是对的(因为 ps aux 的默认列顺序是固定的),但它把脚本的正确性押在「ps aux 的默认输出永远不变」这件事上。换一台系统、换一次 psutil 版本、加上一个环境变量,列顺序都可能变。

所以正确的写法是显式 -o 挑列:

ps -eo pid,ppid,user,%cpu,%mem,comm –sort=-%cpu | head -n 10

这样第 2 列永远是 PID,无论系统怎么变。

完整的推荐写法:

# 按 CPU 排序,取前十
ps -eo pid,ppid,user,%cpu,%mem,comm –sort=-%cpu | head -n 10

# 按内存排序,取前十
ps -eo pid,user,%mem,rss,comm –sort=-%mem | head -n 10

# 看某个用户的所有进程
ps -u ubuntu -o pid,%cpu,comm –sort=-%cpu

# 找某个名字的进程(pgrep 更适合,见 11.6)
pgrep -a nginx

一个容易踩的坑:ps aux | grep nginx 会把 grep 自己也匹配出来(因为命令行里包含 “nginx” 这几个字)。

ps aux | grep \'[n]ginx\’ # 方括号写法:grep 自己的命令行里是 [n]ginx,匹配不上
pgrep -a nginx # 正确做法:这个工具本来就不匹配自己

记住 pgrep 是 ps aux | grep 的正确替代品。


11.3 top 前五行与负载

top 的第一屏信息密度极高,值得逐行读懂。

top – 10:32:17 up 3 days, 4:11, 2 users, load average: 0.52, 0.58, 0.59
Tasks: 128 total, 1 running, 127 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.1 us, 0.9 sy, 0.0 ni, 97.0 id, 0.0 wa, 0.0 hi, 0.0 si
MiB Mem : 3861.4 total, 2352.1 free, 1108.2 used, 401.1 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 512.0 avail Mem

第一行:

  • up 3 days, 4:11 —— 开机时长;
  • load average: 0.52, 0.58, 0.59 —— 1 分钟、5 分钟、15 分钟的平均负载。三个数从左到右,趋势比数值更重要。

关于负载,一条必须记的判据:

负载要和核数比,不是看百分比。

  • 4 核机器上负载 2.5 = 忙得过来;
  • 1 核机器上负载 2.5 = 已经过载了。

三个数的读法:如果 1 分钟的数明显高于 15 分钟,说明负载正在上升;如果 1 分钟低于 15 分钟,说明正在回落。负载高不等于 CPU 满——它还包括处于不可中断睡眠(D 状态)的进程,比如卡在磁盘 I/O 上的。

第三行 %Cpu(s) 那几个缩写:<

赞(0)
未经允许不得转载:网硕互联帮助中心 » Ubuntu Server 入门 12 讲(11):进程与服务 —— 哪一列能信,服务怎么管
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!