linux 基础(10)进程管理

时间:2023-02-19 07:09:41

使用 ps 观察程序

ps -l

ps程序可以查询当前在运行的进程信息。ps -l可以列出详细的信息,默认仅列出当前 bash 相关的进程。

sudo -i
ps -l
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0    2133    2113  0  80   0 -  3026 do_sys pts/0    00:00:00 sudo
4 S     0    2134    2133  0  80   0 -  2651 do_wai pts/0    00:00:00 bash
4 R     0    2146    2134  0  80   0 -  2854 -      pts/0    00:00:00 ps

F代表程序旗标,表明程序的一些性质,图中 4 代表是 root 执行。

S代表该程序的运行状态。

字母 状态
R Running 运行中
S Sleep 休眠中,随意可以唤醒
D Disk Sleep 深入休眠,通常正在进行磁盘IO,不可唤醒
T Stopped 暂停状态
Z Zombie 进程已结束,但父进程没有回收

UID 是进程执行者的 UID, PID 就是进程的 ID,PPID 就是父进程的 PID。

PRI 和 NI 代表程序的执行优先级,越小则越优先执行。

C 代表程序的CPU占用率。ADDR 和 SZ 和内存相关,代表内存中的位置和占内存大小。WCHAN 表示 waiting channel 表明程序的等待运行进度。TIME代表该程序占用CPU运行的时间。

TTY 表示所在的终端,本地终端是TTY,其他则是动态的虚拟终端 pts。CMD 代表是哪个程序指令。

ps aux

ps aux或者ps -aux可以查看当前所有进程(两种不同的参数风格)。

ps aux | head -n 4
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.2 102724 11524 ?        Ss   01:51   0:01 /sbin/init auto noprompt
root           2  0.0  0.0      0     0 ?        S    01:51   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   01:51   0:00 [rcu_gp]

这和ps -l的信息基本是一样,RSS表示使用的物理内存大小,VSZ表示使用的虚拟内存大小,TTY为 ? 表示该进程并不在任何终端下运行。Start 表明该程序开始运行的时间。

top

top 可以动态查看几秒钟内各进程的信息,不过他可以按照内存使用,CPU占用等排序,可以更直观的查看资源使用信息。

linux 基础(10)进程管理

pstree

pstree可以把当前进程的父子调用关系绘制成一个树形图,便于查看他们的关系。

linux 基础(10)进程管理

向程序发送信号

在 linux 中,与程序交互的重要手段之一就是向程序发送信号。kill 可以用于发送信号,kill -l可以查询信号的种类

kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX

使用 kill -signalnumber PID 可以向对应 PID 的程序发送信号。

kill -9 1000 # -9即 kill 信号,强制要求程序退出,这是最常用的
kill -15 %2 # %开头表示背景工作号,-15表示要求正常结束

程序的优先级

每个进程都有一个PRI数值(priority)和 NI 数值(nice),这两个数字加起来就是程序的优先级,越低越优先。

为什么要设置两个数值呢?因为 PRI 是内核算出来的,不可更改的数,NI 则是用户可以手动调整的。通过调整 NI,就可以一定程度上自订程序的优先级。

# nice 命令
nice -n 10 command # 赋值 ni=10 的命令

renice 10 PID # 修改已有进程的 ni 值

root 可以修改所有进程的 NI 值,范围(-20 ~ 19),而一般用户只能调整自己进程的值,范围(0~19)。

查询程序打开的文件

fuser 查询一个文件或目录的使用者。

~$ fuser -v . # -v 查看详细信息
                     USER        PID ACCESS COMMAND
/home/ubuntu:        ubuntu    225862 ..c.. bash

相对的,lsof 查询程序已经打开的文件

lsof [-adu] # 列出程序打开的文件
+d: 限定目录
-u: 限定文件
-a: 需要多个条件同时满足

lsof -u ubuntu 
# 太多了!而且不能指定pid,所以只能用grep选中要查看的程序了
lsof -a -u ubuntu +d .

pidof 可以快速根据命令名查找pid,默认会找出所有的pid

pidof bash
225862