前言
我们拥有操作系统就是为了运行用户程序,程序的运行需要调动进程,因此进程管理就是所有操作系统的心脏。
实际上,进程就是正在执行的程序代码的时事结果。
进程的理解
- 进程:
进程是静态的文件,是运行中的程序的一个副本,且存在生命周期。 - 进程状态:
状态 | 定义 |
---|---|
R(TASK_RUNNING) | 可执行状态(RUNNING,READY) |
S(TASK_INTERRUPTIBLE) | 可唤醒睡眠状态 |
D(TASK_UNINTERRUPTIBLE) | 不可唤醒睡眠状态 |
T(TASK_STOPPED) | 暂停状态 |
Z(EXIT_ZOMBIE) | 僵死态 |
正在运行与就绪态的区别在于是否正在占用cpu的时间片
就绪态与可唤醒状态的区别在于是否在cpu运行的队列中
可唤醒与不可唤醒的区别在于是否拥有程序运行所需要的系统资源。
ctrl+z可使进程进入后台的暂停状态,一般暂停状态是人为操作的。
僵死态指这个进程无父进程给回收其系统资源,会造成系统资源浪费。
进程查看
-
进程树pstree
[root@workstation Desktop]# pstree systemd─┬─ModemManager───2*[{ModemManager}] ├─NetworkManager───2*[{NetworkManager}] ├─accounts-daemon───2*[{accounts-daemon}] ├─agetty ├─atd ├─auditd─┬─sedispatch │ └─2*[{auditd}] ├─avahi-daemon───avahi-daemon ├─boltd───2*[{boltd}] ├─chronyd ├─colord───2*[{colord}] ├─crond ├─cupsd ├─dbus-daemon───{dbus-daemon} ├─dnsmasq───dnsmasq ├─firewalld───{firewalld} ...
进程:是资源调配的最小单位。
线程:内核调度的对象,拥有独立的程序计数器、进程栈和一组进程寄存器。对于linux而言,线程是特殊的进程。也是进程运行的最小单位。
systemd是守护进程。 -
ps命令(显示当前命令执行时进程状态)
a 显示与终端相关进程(BSD)
x 显示所有与终端无关进程(BSD)
u 以用户为归类来显示进程状态信息(BSD)
f 层级结构显示进程信息[root@workstation Desktop]# ps PID TTY TIME CMD 2499 pts/0 00:00:00 bash 3273 pts/0 00:00:00 ps [root@workstation Desktop]# bash [root@workstation Desktop]# ps PID TTY TIME CMD 2499 pts/0 00:00:00 bash 3288 pts/0 00:00:00 bash 3326 pts/0 00:00:00 ps [root@workstation Desktop]# ps f PID TTY STAT TIME COMMAND 2499 pts/0 Ss 0:00 bash 3288 pts/0 S 0:00 \_ bash
o 指定查看选项,pid,comm,nice,pri,pcpu,stat,ppid
-e 显示所有进程(uinx)
-f 显示完整格式信息(unix)
-H 层级结构显示进程的相关信息
-o 指定查看选项,pid,comm,nice,%cpu,%mem,nice[root@workstation Desktop]# ps axo pid,comm,nice,stat | less PID COMMAND NI STAT 1 systemd 0 Ss 2 kthreadd 0 S 3 rcu_gp -20 I< 4 rcu_par_gp -20 I< 6 kworker/0:0H-kb -20 I< 8 mm_percpu_wq -20 I< 9 ksoftirqd/0 0 S 10 rcu_sched 0 I 11 migration/0 - S 12 watchdog/0 - S 13 cpuhp/0 0 S 14 cpuhp/1 0 S 15 watchdog/1 - S
按照某个参数排序:
[root@workstation Desktop]# ps axo pid,comm,%cpu --sort=%cpu(正序,倒序加-号) PID COMMAND %CPU 1 systemd 0.0 2 kthreadd 0.0 3 rcu_gp 0.0 4 rcu_par_gp 0.0 6 kworker/0:0H-kb 0.0 8 mm_percpu_wq 0.0 9 ksoftirqd/0 0.0 10 rcu_sched 0.0 ...
-
ps命令显示信息
[root@workstation Desktop]# ps aux|less USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.1 0.7 244444 13744 ? Ss 00:27 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 17 root 2 0.0 0.0 0 0 ? S 00:27 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? I< 00:27 0:00 [rcu_gp] root 4 0.0 0.0 0 0 ? I< 00:27 0:00 [rcu_par_gp] root 6 0.0 0.0 0 0 ? I< 00:27 0:00 [kworker/0:0H-kblockd] root 8 0.0 0.0 0 0 ? I< 00:27 0:00 [mm_percpu_wq] root 9 0.0 0.0 0 0 ? S 00:27 0:00 [ksoftirqd/0] root 10 0.0 0.0 0 0 ? R 00:27 0:00 [rcu_sched] root 11 0.0 0.0 0 0 ? S 00:27 0:00 [migration/0] root 12 0.0 0.0 0 0 ? S 00:27 0:00 [watchdog/0] root 13 0.0 0.0 0 0 ? S 00:27 0:00 [cpuhp/0] root 14 0.0 0.0 0 0 ? S 00:27 0:00 [cpuhp/1] ...
各个字段的解释如下表所示:
字段 | 解释 |
---|---|
USER | 用户名称 |
PID | 进程id |
%CPU | cpu用量百分比 |
%MEM | 内存用量百分比 |
VSZ | 占用虚拟内存大小 |
RSS | 常驻内存集大小 |
TTY | 字符终端 |
STAT | 进程状态 |
START | 运行时间 |
TIME | 占用cpu时间 |
COMMAND | 进程名称 |
-
pgrep
显示指定信息进程
-u uid 显示指定用户进程
-U name 显示指定用户进程
-t tty 显示指定终端进程
-l 显示进程名称
-a 显示完整格式进程名
-P pid 显示指定进程的子进程
例如:[root@workstation Desktop]# id student uid=1000(student) gid=1000(student) groups=1000(student),10(wheel) [root@workstation Desktop]# pgrep -u 1000 3831 [root@workstation Desktop]# pgrep -l -u 1000 3831 bash [root@workstation Desktop]# pgrep -l -U student 3831 bash [root@workstation Desktop]# pgrep -l -t pts/1 3791 bash 3830 su 3831 bash [root@workstation Desktop]# pgrep -la -t pts/1 3791 bash 3830 su - student 3831 -bash [root@workstation Desktop]# pgrep -P 1 621 656 799 811 863 864 868 869 871 872 875 ... [root@workstation Desktop]# pgrep -aP 1 621 /usr/lib/systemd/systemd-journald 656 /usr/lib/systemd/systemd-udevd 799 /usr/bin/rpcbind -w -f 811 /sbin/auditd 863 /usr/lib/systemd/systemd-machined 864 /usr/sbin/mcelog --ignorenodev --daemon --foreground 868 avahi-daemon: running [workstation.local] 869 /usr/libexec/udisks2/udisksd 871 /sbin/rngd -f 872 /usr/libexec/rtkit-daemon 875 /usr/sbin/smartd -n -q never ...
-
pidof(根据进程名称获取pid)
例如:[root@workstation Desktop]# watch -n 1 date [root@workstation Desktop]# pidof watch 4166 [root@workstation Desktop]# ps aux|grep watch root 12 0.0 0.0 0 0 ? S 00:27 0:00 [watchdog/0] root 15 0.0 0.0 0 0 ? S 00:27 0:00 [watchdog/1] root 36 0.0 0.0 0 0 ? S 00:27 0:00 [watchdogd] root 4166 0.0 0.1 223888 2844 pts/0 S+ 01:42 0:00 watch -n 1 date root 4375 0.0 0.0 221864 972 pts/2 S+ 01:42 0:00 grep --color=auto watch
-
top
top - 01:46:39(当前系统时间) up 1:19(当前系统运行时间), 1 user(当前系统有多少用户正在登录), load average(系统负载): 0.10(一分钟内队列等待数), 0.04(五分钟), 0.01(十五分钟) Tasks(任务): 249 total(总数), 2 running(正在运行数), 247 sleeping, 0 stopped(暂停), 0 zombie %Cpu(s)(cpu使用量): 4.6 us(用户), 1.0 sy(内核), 0.0 ni(调整优先级), 94.1 id(空闲), 0.0 wa(等待输入输出时间), 0.2 hi(硬件中断时间), 0.0 si(软件中断时间), 0.2 st(被偷走的cpu量如虚拟机) MiB Mem(物理内存) : 1829.1 total, 211.9 free, 1003.3 used, 613.9 buff/cache(缓存) MiB Swap(交换内存): 0.0 total, 0.0 free, 0.0 used. 640.1 avail Mem PID(进程号) USER(用户) PR(优先级) NI(优先级代表的nice值) VIRT(vsz虚拟内存) RES(常驻内存地址) SHR(共享资源) S(状态) %CPU(cpu用量) %MEM(内存用量) TIME+ COMMAND(cpu时间即命令名称)
top内部参数:
P cpu百分比排序
M 内存百分比
T 累计占用cpu时间
l 开启/关掉uptime信息
t 开启/关闭task&cpu信息
s 调整刷新频率
k 终止进程
u 查看指定用户进程== top命令参数:==
-d 指定刷新间隔
-b 以批次方式显示
-n 显示批次数量
进程优先级
进程对资源占有的先后顺序
- 按照资源占用划分进程类型
资源使用量 | 进程类型 |
---|---|
cpu使用密集 | CPU-Bound |
I/O使用密集 | I/O-Bound |
-
优先级范围
对Linux而言优先级被划分成固定个数(0-139)
1-99为实时有优先级,数字越大优先级越高,不用手动处理系统自用
100-139为静态优先级,数字越小优先级越高 -
NICE值
NICE值:-20~19对应静态优先级100~139
普通用户只可以调低优先级,超级用户任意调整
关于优先级的命令
• ps ax –o nice,pid,comm
• nice –n 优先级 程序
• reince–n 优先级 程序pid
例如:[root@workstation Desktop]# vim [1]+ Stopped vim [root@workstation Desktop]# ps -o stat,nice,comm,pid STAT NI COMMAND PID Ss 0 bash 2499 S 0 bash 3288 T 0 vim 5343 R+ 0 ps 5350
升高nice值并查看:
[root@workstation Desktop]# renice -n -10 5343 5343 (process ID) old priority 0, new priority -10 [root@workstation Desktop]# ps -o stat,nice,comm,pid STAT NI COMMAND PID Ss 0 bash 2499 S 0 bash 3288 T< -10 vim 5343 R+ 0 ps 5373
降低nice值并查看:
[root@workstation Desktop]# renice -n 10 5343 5343 (process ID) old priority -10, new priority 10 [root@workstation Desktop]# ps -o stat,nice,comm,pid STAT NI COMMAND PID Ss 0 bash 2499 S 0 bash 3288 TN 10 vim 5343 R+ 0 ps 5395
打开vim并放入后台不占用终端:
[root@workstation Desktop]# vim & [2] 5474 [root@workstation Desktop]# ps -o stat,nice,comm,pid STAT NI COMMAND PID Ss 0 bash 2499 S 0 bash 3288 TN 10 vim 5343 T 0 vim 5474 R+ 0 ps 5481 [2]+ Stopped vim
指定优先级并放入后台:
[root@workstation Desktop]# nice -n 5 vim & [3] 5511 [root@workstation Desktop]# ps -o stat,nice,comm,pid STAT NI COMMAND PID Ss 0 bash 2499 S 0 bash 3288 TN 10 vim 5343 T 0 vim 5474 TN 5 vim 5511 R+ 0 ps 5518 [3]+ Stopped nice -n 5 vim
进程前后台调用
相关命令:
指令 | 含义 |
---|---|
jobs | 查看后台任务 |
ctrl+z | 将前台运行任务打入后台 |
bg | 激活后台进程 |
fg | 调回进程 |
& | 运行在后台 |
例如:
[root@workstation Desktop]# jobs
[1] Stopped vim
[2]- Stopped vim
[3]+ Stopped nice -n 5 vim
开启图形编辑并放入后台:
[root@workstation Desktop]# gedit
^Z
[4]+ Stopped gedit
[root@workstation Desktop]# jobs
[1] Stopped vim
[2] Stopped vim
[3]- Stopped nice -n 5 vim
[4]+ Stopped gedit
激活后台可唤醒暂停进程:
[root@workstation Desktop]# bg 4
[4]+ gedit &
[root@workstation Desktop]# jobs
[1] Stopped vim
[2]- Stopped vim
[3]+ Stopped nice -n 5 vim
[4] Running gedit &
激活后台不可唤醒暂停进程:
[root@workstation Desktop]# bg 1
[1] vim &
[1]+ Stopped vim
bg在此不可使用
[root@workstation Desktop]# fg 1
vim
[root@workstation Desktop]# jobs
[2]- Stopped vim
[3]+ Stopped nice -n 5 vim
信号
- 可控信号类型
man 7 signal查看所有信号信息
可控信号 | 含义 |
---|---|
1 | 刷新 |
2 | 中断键盘输入 |
3 | 退出键盘 |
9 | 强制结束 |
15 | 正常关闭 |
18 | 激活进程 |
19 | 强制暂停 |
20 | 正常暂停 |
-
信号指令
kill 信号 pid[root@workstation Desktop]# gedit & [1] 9662 [root@workstation Desktop]# kill -9 9662 [1]+ Killed gedit
killall 信号 进程名称
[root@workstation Desktop]# gedit & [1] 9628 [root@workstation Desktop]# killall -9 gedit [1]+ Killed gedit
pkill 信号 条件(可以–help去查看)
与pgrep很相似,例如: [root@workstation Desktop]# su - student Last login: Sun Jan 19 01:30:16 EST 2020 on pts/1
打开新的一个shell:
[root@workstation Desktop]# pkill -u 1000
原shell:
[student@workstation ~]$ logout
系统守护进程
- 守护进程的定义
守护进程就是通常讲Daemon进程,是linux后台执行的服务进程。它独立于控制终端、周期性地执行某种任务或等待处理某些发生事件,不会随终端关闭而停止,直到接受停止信息才会结束。
后记
需要配置网络,才可以做守护进程的实验,所以暂时无法做。
来源:CSDN
作者:海蜘蛛er
链接:https://blog.csdn.net/Thorne_lu/article/details/104039265