Linux进程管理-学习笔记

怎么是这样的? 2026-07-21 12:21 1


进程是正在运行的程序实例


在Linux中,运行某个命令或者启动服务都会有一个进程


每一个进程在系统中都会分配一个唯一的PID号


当程序结束的时候,PID会被回收,PID是循环使用的


进程的权限来自于用户权限,继承自用户权限


在Linux中使用 ps 命令可以查看进程


静态进程


ps 查看静态进程


`PID`:进程ID号(PID
`TTY`:得到终端的方式(`pts`代表伪终端,远程模式或图形化伪终端;`tty`代表直连;`?`代表没有终端,为内核进程)
`TIME`:表示进程的持续时间
`CMD`:表示运行的命令(进程名)


-a查看所有终端运行的进程


-x可以查看不属于终端的进程,x是查看不属于终端的进程,内核进程等


-o指定选项,搭配 -a使用


-u查看进程详细信息,包括用户名,pid,占用信息等


-e查看所有进程


-f查看用户PID PPID cpu占用等


--sort指定排序参数


ps -aux --sort=%cpu #以cpu升序排序
ps -aux --sort=-%cpu #以cpu降序排序
ps -aux --sort=%cpu | tail #以cpu升序排序,展示末尾10行(展示占用最高的进程


常用的组合用法:


ps -aux 偏系统占用


ps -ef偏进程关系




这块很绕,我现在还在思考 -ax 和 -e的区别,为什么不直接用 -eu 而是用-aux


我感觉到自学的难处了,我的问题我压根找不到合适的人去问,感觉都很冒昧,虽然现在AI盛行,但AI说的我压根听不懂


我自己研究了一下,-ax和-e输出的内容确实是不一样的,-ax会输出stat,而-e不会,甚至两边输出的命令一个是截断的,一个是完整的;-aux和-eu输出的其实本质上没见差别,但-eu输出的command命令巨长,不知道为什么?这部分还要去问,这份巨长的命令是啥?-eu输出的基本没有可读性,这是我能见到的最本质的区别,为什么会这样仍不清楚


root@VM-0-4-debian:~# ps -ax | head
PID TTY STAT TIME COMMAND
1 ? Ss 7:42 /usr/lib/systemd/systemd --system --deserialize=50 showopts
2 ? S 0:04 [kthreadd]
3 ? S 0:00 [pool_workqueue_release]
4 ? I< 0:00 [kworker/R-kvfree_rcu_reclaim]
5 ? I< 0:00 [kworker/R-rcu_gp]
6 ? I< 0:00 [kworker/R-sync_wq]
7 ? I< 0:00 [kworker/R-slub_flushwq]
8 ? I< 0:00 [kworker/R-netns]
11 ? I< 0:00 [kworker/0:0H-events_highpri]
root@VM-0-4-debian:~# ps -e | head
PID TTY TIME CMD
1 ? 00:07:42 systemd
2 ? 00:00:04 kthreadd
3 ? 00:00:00 pool_workqueue_release
4 ? 00:00:00 kworker/R-kvfree_rcu_reclaim
5 ? 00:00:00 kworker/R-rcu_gp
6 ? 00:00:00 kworker/R-sync_wq
7 ? 00:00:00 kworker/R-slub_flushwq
8 ? 00:00:00 kworker/R-netns
11 ? 00:00:00 kworker/0:0H-events_highpri
root@VM-0-4-debian:~# ps -ef | head
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 May15 ? 00:07:42 /usr/lib/systemd/systemd --system --deserialize=50 showopts
root 2 0 0 May15 ? 00:00:04 [kthreadd]
root 3 2 0 May15 ? 00:00:00 [pool_workqueue_release]
root 4 2 0 May15 ? 00:00:00 [kworker/R-kvfree_rcu_reclaim]
root 5 2 0 May15 ? 00:00:00 [kworker/R-rcu_gp]
root 6 2 0 May15 ? 00:00:00 [kworker/R-sync_wq]
root 7 2 0 May15 ? 00:00:00 [kworker/R-slub_flushwq]
root 8 2 0 May15 ? 00:00:00 [kworker/R-netns]
root 11 2 0 May15 ? 00:00:00 [kworker/0:0H-events_highpri]
root@VM-0-4-debian:~# ps -aux | head
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 25412 14036 ? Ss May15 7:42 /usr/lib/systemd/systemd --system --deserialize=50 showopts
root 2 0.0 0.0 0 0 ? S May15 0:04 [kthreadd]
root 3 0.0 0.0 0 0 ? S May15 0:00 [pool_workqueue_release]
root 4 0.0 0.0 0 0 ? I< May15 0:00 [kworker/R-kvfree_rcu_reclaim]
root 5 0.0 0.0 0 0 ? I< May15 0:00 [kworker/R-rcu_gp]
root 6 0.0 0.0 0 0 ? I< May15 0:00 [kworker/R-sync_wq]
root 7 0.0 0.0 0 0 ? I< May15 0:00 [kworker/R-slub_flushwq]
root 8 0.0 0.0 0 0 ? I< May15 0:00 [kworker/R-netns]
root 11 0.0 0.0 0 0 ? I< May15 0:00 [kworker/0:0H-events_highpri]
root@VM-0-4-debian:~# ps -eu | head
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3772 0.0 0.0 9232 1704 tty1 Ss+ May15 0:00 /sbin/agetty -o -- \u --noreset --noclear - linux PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin USER=root INVOCATION_ID=f64b781cbb744f9b924ec982cc030e41 TERM=linux CREDENTIALS_DIRECTORY=/run/credentials/[email protected] SYSTEMD_EXEC_PID=3772 MEMORY_PRESSURE_WATCH=/sys/fs/cgroup/system.slice/system-getty.slice/[email protected]/memory.pressure MEMORY_PRESSURE_WRITE=c29tZSAyMDAwMDAgMjAwMDAwMAA=
root 3789 0.0 0.0 8844 1644 ttyS0 Ss+ May15 0:00 /sbin/agetty -o -- \u --noreset --noclear --keep-baud 115200,57600,38400,9600 - vt220 LANG=en_US.UTF-8 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin USER=root INVOCATION_ID=6d4cd974ecea4396adfe850248358990 TERM=vt220 CREDENTIALS_DIRECTORY=/run/credentials/[email protected] SYSTEMD_EXEC_PID=3789 MEMORY_PRESSURE_WATCH=/sys/fs/cgroup/system.slice/system-serial\x2dgetty.slice/[email protected]/memory.pressure MEMORY_PRESSURE_WRITE=c29tZSAyMDAwMDAgMjAwMDAwMAA=
root 1287679 0.0 0.1 10060 5936 pts/0 Ss 14:41 0:00 -bash USER=root LOGNAME=root HOME=/root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin SHELL=/bin/bash TERM=xterm DISPLAY=localhost:10.0 XDG_SESSION_ID=95672 XDG_RUNTIME_DIR=/run/user/0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus XDG_SESSION_TYPE=tty XDG_SESSION_CLASS=user MOTD_SHOWN=pam GOPROXY=https://mirrors.tencent.com/go,direct LANG=en_US.utf8 LANGUAGE=en_US.utf8 SSH_CLIENT=39.154.138.209 2610 22 SSH_CONNECTION=39.154.138.209 2610 10.0.0.4 22 SSH_TTY=/dev/pts/0
root 1308516 0.0 0.1 10472 4408 pts/0 R+ 16:10 0:00 ps -eu SHELL=/bin/bash LANGUAGE=en_US.utf8 PWD=/root LOGNAME=root XDG_SESSION_TYPE=tty MOTD_SHOWN=pam HOME=/root LANG=en_US.utf8 PROMPT_COMMAND=history -a; SSH_CONNECTION=39.154.138.209 2610 10.0.0.4 22 XDG_SESSION_CLASS=user TERM=xterm USER=root GOPROXY=https://mirrors.tencent.com/go,direct DISPLAY=localhost:10.0 SHLVL=1 XDG_SESSION_ID=95672 XDG_RUNTIME_DIR=/run/user/0 SSH_CLIENT=39.154.138.209 2610 22 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus SSH_TTY=/dev/pts/0 _=/usr/bin/ps
root 1308517 0.0 0.0 6644 2112 pts/0 S+ 16:10 0:00 head SHELL=/bin/bash LANGUAGE=en_US.utf8 PWD=/root LOGNAME=root XDG_SESSION_TYPE=tty MOTD_SHOWN=pam HOME=/root LANG=en_US.utf8 PROMPT_COMMAND=history -a; SSH_CONNECTION=39.154.138.209 2610 10.0.0.4 22 XDG_SESSION_CLASS=user TERM=xterm USER=root GOPROXY=https://mirrors.tencent.com/go,direct DISPLAY=localhost:10.0 SHLVL=1 XDG_SESSION_ID=95672 XDG_RUNTIME_DIR=/run/user/0 SSH_CLIENT=39.154.138.209 2610 22 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus SSH_TTY=/dev/pts/0 _=/usr/bin/head


我看了一下,好像是unix语法和BSD语法的输出逻辑不同,所以我好像是混用了两套逻辑


我又去查了一下,这两套语法碰巧都有u这个参数,所以我认为的混用其实在系统看来是两套逻辑


标准语法是不带有 -这个参数符的,所以正常写的话应该是 ps aux而不应该是 ps -aux


如果混用的话应该是这么写,ps -e u


root@VM-0-4-debian:~# ps -e u | head
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 25412 14036 ? Ss May15 7:42 /usr/lib/systemd/systemd --system --deserialize=50 showopts
root 2 0.0 0.0 0 0 ? S May15 0:04 [kthreadd]
root 3 0.0 0.0 0 0 ? S May15 0:00 [pool_workqueue_release]
root 4 0.0 0.0 0 0 ? I< May15 0:00 [kworker/R-kvfree_rcu_reclaim]
root 5 0.0 0.0 0 0 ? I< May15 0:00 [kworker/R-rcu_gp]
root 6 0.0 0.0 0 0 ? I< May15 0:00 [kworker/R-sync_wq]
root 7 0.0 0.0 0 0 ? I< May15 0:00 [kworker/R-slub_flushwq]
root 8 0.0 0.0 0 0 ? I< May15 0:00 [kworker/R-netns]
root 11 0.0 0.0 0 0 ? I< May15 0:00 [kworker/0:0H-events_highpri]


逻辑理清了




w 查看当前系统的登录用户(who


查看实时进程


top实时查看系统进程


top - 15:49:43 up 52 days, 16:14,  2 users,  load average: 0.01, 0.08, 0.0
Tasks: 169 total, 1 running, 168 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.6 sy, 0.0 ni, 99.1 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 3729.3 total, 277.6 free, 1798.5 used, 1940.8 buff/cach
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 1930.8 avail Mem

15:49:43 当前时间
52 days, 16:14 开机了52天16小时14分钟
2 users 两个用户在线(包含有伪终端等,我这里是vnc一个root用户,和ssh一个root用户)
load average: 0.01, 0.08, 0.0 cpu平均占用(每分钟,五分钟,十分钟)
Tasks: 169 total 进程总数(169个
1 running 1个进程正在运行
168 sleeping 168个进程正在休眠
0 stopped 0个停止运行
0 zombie 0个僵尸进程
%Cpu(s) 0.3 us 用户空间,用户运行的进程占用cpu的百分比
0.6 sy 内核空间占用的百分比,IO,内存分配等,内核运行的进程占用cpu的百分比
0.0 ni 优先级进程,没有指定优先级即为0,用户自定义优先级的进程占用cpu的百分比
99.1 id cpu空闲百分比
0.1 wa 等待磁盘io的操作时间,过大的话cpu和硬盘性能差异过大
0.0 hi 硬中断,硬件中断进程占用cpu的百分比/时间
0.0 si 软中断,软件发送的中断消息
0.0 st 表示虚拟机等待cpu的时间
3729.3 total 当前的内存总量以m为单温,使用free命令可以查看内存
277.6 free 空闲的内存
1798.5 used 使用的内存
1940.8 buff/cach
0.0 total, 交换分区总量
0.0 free, 空闲的交换分区
0.0 used. 使用的交换分区
1930.8 avail Mem 可用的内存大小


top -d1设置1秒刷新一次


1 将每颗逻辑cpu资源信息都列出来


M 以内存进行排序


m 将内存总量以进度条形式列出


P 以cpu进行排序


C 查看命令的全称


T 会根据进程占用时间排序


f 可以选择要显示的内容


k 输入PID 可以干掉进程


使用 ps -p [pid]可以查看指定进程


孤儿进程和僵尸进程


孤儿进程:子进程在运行过程中,父进程因各种原因关闭。(会有PID为1的系统进程接管关闭)


僵尸进程:子进程在运行过程中,父进程因各种原因不回复子进程的消息,疯狂占用资源


pgrep通过信息查询进程


-U通过用户名查询进行


-G通过用户组查询


-u通过用户的UID查询


-g通过GID查询


-P通过父进程查询子进程


-l打印命令


-o如果后台同时有多个相同的进程,查找最早运行的进程


pgrep -o vim -l


-n如果后台同时有多个相同的进程,查找最后运行的进程


-d指定分隔符(shell常用


pidof根据进程名进行查询


pgrep 模糊查询


pidof 精确查询




进程之间的通信方式


管道、信号、消息队列、共享内存、socket套接字等


Linux中默认使用信号进行通信


当进程接收到信号后,优先执行信号的操作


内核产生信号;用户手动产生的信号


kill命令是一个信号工具,他不只是能干掉进程,默认使用kill使用的是15号信号也就是干掉进程


kill -l可以列出所有信息


kill -15 1510向1510程序发送15号信号


singnal 15 默认,关闭程序


singnal 9 强制退出(会导致文件损坏


singnal 1重新加载配置文件


killall [进程名]会一并关闭所有同名的进程,例如vim


pkill


可以结束一个终端、一个用户的所有进程


pkill -kill -t tty/2 踢掉一个用户


pkill -9 -t tty/2 踢掉一个用户


pkill -t tty/2结束一个终端的所有进程


pkil -u [用户名]结束一个用户的所有进程


pkill -9 vim强制结束进程


进程的优先级


在系统繁忙的时候,高优先级的进程优先分配cpu资源,优先级越高越优先分配cpu资源


Linux中有两种优先级:



  • PR动态优先级(内核自动调整

  • NI静态优先级(用户手动调整


NI静态优先级的范围:-20~19(数字越小,优先级越高)


只有root用户可以调整NI静态优先级




renice命令


修改已经启动的进程的静态优先级


renice -n [优先级] [PID]


nice命令


在启动时调整进程的静态优先级


nice -n [优先级] [执行的命令]




后台作业


将一个进程放入到后台执行,让前端终端能够输入命令,不被进程占用


后台作业仅用于本终端,不可跨终端


使用 &符号,即可放入后台执行


ping baidu.com &


jobs 查看当前终端运行的作业


kill %[作业号]结束作业


Ctrl + z将前台运行的作业放入后台并停止 或 kill -19这个我没理解


bg %[作业号]后台运行作业


fg %[作业号]前台运行作业

最新回复 (2)
  • xuanxuan 07-21 12:28
    1

    Linux学习之进程,哪个进程又又又变成僵尸进程了,让我找找看^-^




    等多出几个知识点,可以弄个主贴做导航,相当于目录,


    不说了,前排支持

  • 双持金枪客 07-23 20:04
    2

    想问下佬是怎么学习 Linux 相关知识的,我自己最近在看 b 站的教学视频,感觉不咋滴,知识分布也比较乱,还有就是学不下去^-^

* 帖子来源Linux.do
返回