linux进程管理
1.进程的概念
1.进程是一个程序启动的一种状态(运行的),进程是已启动的可执行程序的运行的状态。
2.proc
目录下以数字为名的目录,每一个目录代表一个进程,保存着进程的属性信息。每一个进程的PID
是唯一的,就算进程退出了,其它进程也不会占用其PID
。
[root@SYL2 ~]# ls /proc/
1 204 231 4784 55 769 consoles mounts
10 205 232 4790 550 8 cpuinfo mpt
1008 206 233 4791 552 810 crypto mtrr
1009 207 234 48 553 811 devices net
200 228 46 540 672 buddyinfo mdstat
201 229 47 541 673 bus meminfo
202 23 4775 542 674 cgroups misc
203 230 4781 549 675 cmdline modules
[root@SYL2 ~]#
3.进程的组成:
- 进程运行中分配内存所在的地址空间
- 安全属性,包括所有权凭据和特权等权限
- 程序代码的一个或多个执行线程(程序可多次打开)
- 进程状态(运行,停止)
4.系统是多用户(多用户同时在使用计算机),多任务(登录系统可以打开多个程序)的系统
5.进程环境:
- 本地和全局变量
- 当前调度上下文,让一个进程先运行一会,让另一个运行,给记录下的过程
- 分配的系统资源,如文件描述符和网络端口
6.进程的产生:
-
现有的(父)进程
ppid
复制自己的地址空间来创建一个新的子进程pid
结构。 -
每个新进程分配有一个唯一的进程
ID(PID)
,满足跟踪和安全性之需。PID
与父进程ID(PPID)
是新进程环境的元素。 -
一个父进程分离(分叉)一个子进程,子进程运行执行命令(会分离另一个子进程)完成后发出信号,退出会回到父进程,在退出时,子进程可能已经关闭或丢弃了其资源和环境,剩余的部分被称作僵停。而在子进程运行时父进程会处于休眠状态,父进程在等待子进程发出信号被唤醒,清理剩余结构,然后继续执行其自己的程序代码.
7.分类:
- 前台进程:与终端相关的进程,通过终端启动的进程
- 守护进程:daemon,与终端无关的进程(如内核),在系统引导过程中启动的进程
2.进程状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ww6ZIxy-1657286759617)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220331161745211.png)]
1.进程睡眠的原因:当一个执行中的进程,需要加载额外的IO资源的时候,由于IO设备的速度太慢,所以会转入睡眠状态等待,交出CPU给其他进程,以免浪费剩余执行时间.
2.进程状态
2.1 T(运行状态)–TASK_RUNNING:进程正在CPU上执行,或者正在等待运行。处于运行中(或可运行)状态时,进程可能正在执行用户例程或内核例程(系统调用),或者已排队并就绪
2.2 Z(僵停状态)—EXIT_ZOMBIE:子进程在退出时向父进程发出信号。除进程身份(PID)
之外的所有资源都已释放,用defunct
或者exiting
3.进程优先级
3.1进程调度程序:通过时间分片技术,Linux和其他操作系统实际能够运行的进程数可以超出可用的实际处理单元数。操作系统进程调度程序将在单个核心上的进程之间进行快速切换,从而给用户一种有多个进程在同时运行的印象。cpu
需要运行的进程数量总是超出实际具有的核心数。
3.2优先级:
- 进程优先级范围:0-139,数字越小,优先级越高
- 0-99:实时(绝对)优先级,内核调整
- 100-139(-20到19):静态优先级,普通用户可控制,-20对应100优先值最大,19对应139最小
nice
级别越高,表示优先级越低(该进程容易将其CPU使用量让给其他进程)
nice
级别越低,表示优先级越高(该进程更加不倾向于让出CPU)
- 进程优先级高的特点:
- 获得更多的CPU运行时间
- 更优先获得CPU运行的机会
3.3为很占CPU资源的进程设置较低的nice
级别可能会对同一系统上运行的其他进程的性能造成负面影响,所以仅允许root用户设置负nice
级别以及降低现有进程的nice
级别。可以提高(-20到-1)不能降低
普通非特权用户仅允许设置正的nice
级别。只能对现有进程提升nice
级别,而不能降低nice
级别。可以设置(1-19)降低,不能提高
4.进程管理命令
4.1 进程优先级调整:调整nice值
-
调整已经启动的
nice
值 — renice -
[root@SYL2 ~]# ps -elf|grep sleep 0 S root 5058 5035 0 80 0 - 1828 hrtime 16:51 pts/1 00:00:00 sleep 6000 //原先nice为80 0 S root 5073 5003 0 80 0 - 3035 - 16:54 pts/0 00:00:00 grep --color=auto sleep [root@SYL2 ~]# renice -10 5058 5058 (process ID) old priority 0, new priority -10 [root@SYL2 ~]# ps -elf|grep sleep 0 S root 5058 5035 0 70 -10 - 1828 hrtime 16:51 pts/1 00:00:00 sleep 6000 //nice调成70 0 S root 5076 5003 0 80 0 - 3035 - 16:55 pts/0 00:00:00 grep --color=auto sleep [root@SYL2 ~]#
-
在启动时指定
nice
值 — nice -
[root@SYL2 ~]# nice -n -8 sleep 800 [root@SYL2 ~]# ps -elf|grep sleep 4 S root 5077 5003 0 72 -8 - 1828 hrtime 16:58 pts/0 00:00:00 sleep 800 0 S root 5081 5035 0 80 0 - 3035 - 16:58 pts/1 00:00:00 grep --color=auto sleep [root@SYL2 ~]#
4.2 ps(process state)
命令用于列出当前的进程。可以显示详细的进程信息:
- 用户识别符(UID),它确定进程的特权
- 唯一进程识别符(PID)
- CPU和已经花费的实时时间
- 进程在各种位置上分配的内存数量
- 进程的位置STDOUT,称为控制终端
- 当前的进程状态
4.3 ps显示进程信息:
-
加了[]中括号的,表示内核线程,通常位于顶部
-
exiting或defunct表示僵尸进程
-
[root@SYL2 ~]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 13:28 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deseria root 2 0 0 13:28 ? 00:00:00 [kthreadd] root 3 2 0 13:28 ? 00:00:00 [rcu_gp] root 4 2 0 13:28 ? 00:00:00 [rcu_par_gp] root 6 2 0 13:28 ? 00:00:00 [kworker/0:0H-events_highpri] root 8 2 0 13:28 ? 00:00:00 [kworker/u256:0-events_unbound] root 9 2 0 13:28 ? 00:00:00 [mm_percpu_wq]
4.4 ps命令
a //显示所有与终端有关的进程
u //显示进程是由哪个用户启动的
x //显示所有与终端无关的进程
-e //显示所有进程,与-A效果相同
-l //以长格式显示
-F //显示更详细的完整格式的进程信息
-f //显示更详细的完整格式的进程信息
-H //以进程层级格式显示进程相关信息
-o //根据自己的需要选择要显示的字段
[root@SYL2 ~]# ps -o pid,comm,nice
PID COMMAND NI
5035 bash 0
5111 ps 0
-
ps aux
-
[root@SYL2 ~]# ps aux|head -2 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.7 240444 13380 ? Ss 13:28 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 18 VSZ //Virtual memory SiZe,虚拟内存集 RSS //ReSident Size,常驻内存集 STAT //进程状态 TIME //运行时的累积时长
-
ps -ef 显示进程前两行
-
ps -elf 查看线程数
-
[root@SYL2 ~]# ps -ef|head -2 UID PID PPID C STIME TTY TIME CMD root 1(系统第一个进程) 0(父进程) 0(CPU)13:28(启动时间) ?(启动位置) 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 18(执行的任务) [root@SYL2 ~]# ps -elf|head -2 F S UID PID PPID PRI NI ADDR SZ WCHAN STIME TTY TIME CMD 4(文件描述符) S(状态) root 1 0 0 80(在内存中得位置) 0 - 60111 do_epo 13:28 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 18 NI //nice值 PRI //优先级 PSR //进程运行在哪个CPU核心上 RTPTRIO //实时优先级 C //运行的CPU编号 STIME //进程的启动时间 VSZ //Virtual memory SiZe,虚拟内存集 RSS //ReSident Size,常驻内存集 STAT //进程状态 TIME //运行时的累积时长
-
pstree
用于显示当前系统上的进程树 -
[root@SYL2 ~]# pstree systemd─┬─NetworkManager───2*[{NetworkManager}] ├─VGAuthService ├─agetty ├─auditd───{auditd} ├─crond ├─dbus-daemon───{dbus-daemon} ├─firewalld───{firewalld} ├─irqbalance───{irqbalance} ├─polkitd───7*[{polkitd}] ├─rsyslogd───2*[{rsyslogd}] ├─sshd─┬─sshd───sshd───bash │ └─sshd───sshd───bash───pstree ├─sssd─┬─sssd_be │ └─sssd_nss ├─systemd───(sd-pam) ├─systemd-journal ├─systemd-logind ├─systemd-udevd ├─tuned───4*[{tuned}] └─vmtoolsd───3*[{vmtoolsd}] [root@SYL2 ~]#
-
pgrep
取进程号 -
[root@SYL2 ~]# pgrep sleep 5120 [root@SYL2 ~]# ps -ef|grep sleep root 5120 5003 0 17:44 pts/0 00:00:00 sleep 700 root 5123 5035 0 17:44 pts/1 00:00:00 grep --color=autosleep [root@SYL2 ~]#
-
pidof
取进程号 -
[root@SYL2 ~]# ps -ef|grep sleep root 5120 5003 0 17:44 pts/0 00:00:00 sleep 700 root 5123 5035 0 17:44 pts/1 00:00:00 grep --color=autosleep [root@SYL2 ~]# pidof sleep 5120 [root@SYL2 ~]#
-
vmstat
虚拟内存状态查看命令 -
[root@SYL2 ~]# vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 1201684 4204 375340 0 0 5 1 39 58 0 0 100 0 0 [root@SYL2 ~]#
-
[root@SYL2 ~]# vmstat 2 2 //表示每2秒刷新一次,刷新2次后退出 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 0 1201564 4204 375380 0 0 5 1 39 58 0 0 100 0 0 0 0 0 1201444 4204 375380 0 0 0 0 160 219 0 0 100 0 0 procs:进程 r(running) //表示等待运行的队列长度,也即等待运行的进程的个数 b(block) //表示阻塞队列长度,也即处于不可中断睡眠态的进程个数 memory:内存 swpd //交换内存的使用总量,把不经常用的程序先暂停放的空间 free //空闲物理内存总量,真实运行还有多少可用 buffer //用于buffer的内存总量(缓冲) cache //用于cache的内存总量(缓存) swap:交换分区,把不常运行的程序放进去 si(swap in) //表示从物理内存有多少页面换进swap,也即数据进入swap的数据速率(kb/s) so(swap out) //表示从swap有多少页面换进物理内存,也即数据离开swap的数据速率(kb/s) io:硬盘 bi(block in) //从硬盘读入数据到系统的速率(kb/s) bo(block out) //从系统保存数据到硬盘的速率(kb/s) system: in( interrupts) //表示中断的个数,也即中断速率(kb/s) cs(context switch) //表示上下文切换的次数,也即进程切换速率(kb/s)上下文切换次数多表示CPU数量不够处理不过来,cs越小说明上下文切换少,CPU够用 CPU: us //表示用户空间 sy //表示内核空间 id //表示空闲百分比 wa //表示等待IO完成所占据的时间百分比 st //表示steal,被虚拟化技术偷走的时间(比如运行虚拟机)
5.控制作业
5.1 Linux作业分为前台作业与后台作业两种。其各自的特点如下:
-
前台作业:通过终端启动,且启动后一直占据了命令提示符
-
[root@SYL2 ~]# sleep 700 //一直在前台运行 [root@SYL2 ~]# ps -ef|grep sleep root 5149 5003 0 18:11 pts/0 00:00:00 sleep 700 root 5162 5035 0 18:20 pts/1 00:00:00 grep --color=autosleep [root@SYL2 ~]# [root@SYL2 ~]# ps -ef|grep sleep //直接关闭就没了 root 5224 5035 0 18:21 pts/1 00:00:00 grep --color=autosleep [root@SYL2 ~]# [root@SYL2 ~]# sleep 900 & //在后台运行 [1] 5253 [root@SYL2 ~]# ps -ef|grep sleep root 5253 5035 0 18:23 pts/1 00:00:00 sleep 900 root 5255 5035 0 18:23 pts/1 00:00:00 grep --color=autosleep [root@SYL2 ~]# ps -ef|grep sleep //把终端关闭,后台运行还是没有 root 5346 5170 0 18:25 pts/2 00:00:00 grep --color=autosleep [root@SYL2 ~]#
-
后台作业:可以通过终端启动,但启动之后,释放命令提示符,后续的操作在后台完成
-
此类作业虽然被送往后台运行,但其依然与终端相关。如果希望送往后台后,剥离与终端的关系需要执行(
nohup COMMAND &
) -
[root@SYL2 ~]# nohup sleep 9000 & //加个nohup 在后台运行退出还能运行别的命令 [1] 5350 [root@SYL2 ~]# nohup: ignoring input and appending output to 'nohup.out' [root@SYL2 ~]# ls 1.1.txt abc anaconda-ks.cfg nohup.out ttt [root@SYL2 ~]# [root@SYL2 ~]# ps -ef|grep sleep root 5350 1 0 18:27 ? 00:00:00 sleep 9000 root 5414 5390 0 18:28 pts/0 00:00:00 grep --color=autosleep [root@SYL2 ~]#
-
5.2 在后台作业
-
[root@SYL2 ~]# sleep 600 & //在命令后跟上&符号可以生成一个后台作业 [1] 5444 [root@SYL2 ~]# jobs //用于显示当前所有的后台作业 [1]+ Running sleep 600 & [root@SYL2 ~]# fg //fg命令用于将后台作业调至前台运行 sleep 600 ^Z //使用ctrl+z可将前台进程发送到后台,此时作业将处于停止状态 [1]+ Stopped sleep 600 [root@SYL2 ~]# jobs [1]+ Stopped sleep 600 [root@SYL2 ~]# bg //在后台继续运行 [1]+ sleep 600 & [root@SYL2 ~]# jobs [1]+ Running sleep 600 &
-
kill
停止命令 -
[root@SYL2 ~]# sleep 1000 & [2] 5447 [root@SYL2 ~]# sleep 2000 & [3] 5448 [root@SYL2 ~]# sleep 3000 & [4] 5449 [root@SYL2 ~]# jobs [1] Running sleep 600 & [2] Running sleep 1000 & [3]- Running sleep 2000 & [4]+ Running sleep 3000 & [root@SYL2 ~]# kill %2 //停止第二个命令 [root@SYL2 ~]# jobs [1] Running sleep 600 & [2] Terminated sleep 1000 [3]- Running sleep 2000 & [4]+ Running sleep 3000 & jobs命令的结果中 + //命令将默认操作的作业 - //命令将第二个默认操作的作业
-
[root@SYL2 ~]# jobs [1] Running sleep 1000 & [2] Running sleep 2000 & [3]- Running sleep 3000 & [4]+ Running sleep 5000 & [root@SYL2 ~]# fg sleep 5000 ^C //终止 [root@SYL2 ~]# jobs [1] Running sleep 1000 & [2]- Running sleep 2000 & [3]+ Running sleep 3000 & [root@SYL2 ~]#
6.进程通信
进程间通信(IPC:Inter Process Communication)
进程间通信方式:
-
同一主机
-
共享内存
-
信号:Signal
-
[root@SYL2 ~]# kill -l 1) SIGHUP 挂起 2) SIGINT 键盘中断 9) SIGKILL 发送信号立刻终止进程,中断,无法拦截 15) SIGTERM 发送信号要等待运行完成才终止进程,终止,默认
-
-
kill
命令根据ID向进程发送信号,可用于发送任何信号,终止程序的信号 -
指定一个信号的方法:
信号号码(数字标识):kill -2 信号完整名称:kill -SIGINT 信号简写名称:kill -INT [root@SYL2 ~]# ps -ef|grep sleep root 5350 1 0 18:27 ? 00:00:00 sleep 9000 root 5455 5421 0 18:40 pts/1 00:00:00 sleep 2000 root 5456 5421 0 18:40 pts/1 00:00:00 sleep 3000 root 5480 5421 0 19:03 pts/1 00:00:00 grep --color=autosleep [1] Done sleep 1000 [root@SYL2 ~]# kill -9 5350 [root@SYL2 ~]# !ps ps -ef|grep sleep root 5455 5421 0 18:40 pts/1 00:00:00 sleep 2000 root 5456 5421 0 18:40 pts/1 00:00:00 sleep 3000 root 5484 5421 0 19:04 pts/1 00:00:00 grep --color=autosleep [root@SYL2 ~]# [root@SYL2 ~]# ps -ef|grep sleep root 5455 5421 0 18:40 pts/1 00:00:00 sleep 2000 root 5456 5421 0 18:40 pts/1 00:00:00 sleep 3000 root 5487 5421 0 19:05 pts/1 00:00:00 grep --color=autosleep [root@SYL2 ~]# killall sleep //删除所有的进程 [2]- Terminated sleep 2000 [3]+ Terminated sleep 3000 [root@SYL2 ~]# !ps ps -ef|grep sleep root 5490 5421 0 19:05 pts/1 00:00:00 grep --color=autosleep [root@SYL2 ~]# [root@SYL2 ~]# ps -ef|grep sleep root 5491 5421 0 19:06 pts/1 00:00:00 sleep 125 root 5492 5421 0 19:06 pts/1 00:00:00 sleep 150 root 5493 5421 0 19:07 pts/1 00:00:00 sleep 500 root 5495 5421 0 19:07 pts/1 00:00:00 grep --color=autosleep [root@SYL2 ~]# pkill sleep //根据·pid·删除进程 [1] Terminated sleep 125 [2]- Terminated sleep 150 [3]+ Terminated sleep 500 [root@SYL2 ~]# ps -ef|grep sleep root 5498 5421 0 19:07 pts/1 00:00:00 grep --color=autosleep [root@SYL2 ~]#
-
基本进程管理信号
-
信号编号 名称 定义 用途 1 HUP 挂起 让一个进程不用重启就可以重读配置文件,并让新的配置信息生效 2 INT 键盘中断 中断一个前台进程。ctrl+c就是用的SIGINT信号 9 KILL 中断,无法拦截 导致立即终止程序。无法被拦截、忽略或处理 15(默认) TERM 终止 导致程序终止。和SIGKILL不同,可以被拦截、忽略或处理。要求程序终止的友好方式,允许自我清理 - 用户可以中断自己的进程,但只有root才能终止由其他人拥有的进程。
-
不同主机
-
rpc:remote procecure call
------- | ------------------------------------------------------------ |
| 1 | HUP | 挂起 | 让一个进程不用重启就可以重读配置文件,并让新的配置信息生效 |
| 2 | INT | 键盘中断 | 中断一个前台进程。ctrl+c就是用的SIGINT信号 |
| 9 | KILL | 中断,无法拦截 | 导致立即终止程序。无法被拦截、忽略或处理 |
| 15(默认) | TERM | 终止 | 导致程序终止。和SIGKILL不同,可以被拦截、忽略或处理。要求程序终止的友好方式,允许自我清理 | -
用户可以中断自己的进程,但只有root才能终止由其他人拥有的进程。
-
-
不同主机
- rpc:remote procecure call
- 基于socket实现进程间通信
- rpc:remote procecure call