进程基本概述
-
什么是进程(process)
当我们运行一个程序,那么我们将运行的程序叫进程
PS1:当程序运行为进程后,系统会为该进程分配内存,以及进程运行的身份和权限
PS2:在进程运行的过程中,服务器上会有各种状态来表示当前进程的指标信息 -
程序和进程的区别
程序是数据和指令的集合,是一个静态的概念,比如/bin/ls /bin/cp 等二进制文件,同时程序可以长期存在系统中
进程是程序运行的过程,是一个动态的概念,进程是存在生命周期概念的,也就是说进程随着程序的终止而销毁,不会永久存在系统中 -
程序的生命周期
一个对象从无到有、从有到无过程称为生命周期
当父进程接收到任务调度时,会通过fock派生子进程来处理,子进程会继承父进程衣钵(相当于完全复制了一份父进程的信息)
- 子进程在处理任务代码时,父进程会进入等待状态中
- 子进程在处理任务代码后,会执行退出,然后唤醒父进程来回收子进程的资源
- 如果子进程在处理任务过程中,父进程退出,子进程没有退出,子进程没有被父进程管理,则变为僵尸进程
- 每个进程都有自己的PID号,子进程称为PPID
监控进程状态
程序在运行后,我们需要了解进程的运行状态,查看进程的状态分为:静态和动态两种方式
使用ps命令静态查看当前的进程状态
ps -auxf常用组合方式查看进程、PID、占用cpu百分比,占用内存百分比,状态、执行的命令等
- -a显示所有终端机下执行的进程,除了阶段作业领导者之外
- -u以用户为主的格式来显示进程状况
- -x显示所有进程,不以终端机来区分
- -f用ASCII字符显示树状结构,表达进程间的相互关系
[root@b13k ~]#ps -auxf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S 00:33 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 00:33 0:00 \_ [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 00:33 0:01 \_ [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S 00:33 0:00 \_ [migration/0]
root 8 0.0 0.0 0 0 ? S 00:33 0:00 \_ [rcu_bh]
root 9 0.0 0.0 0 0 ? S 00:33 0:03 \_ [rcu_sched]
#太长
USER————该 process 属于那个使用者账号的
PID—————该 process 的号码
%CPU ———–该 process 使用掉的 CPU 资源百分比
%MEM———–该 process 所占用的物理内存百分比
VSZ—————该 process 使用掉的虚拟内存量 (Kbytes)
RSS—————该 process 占用的固定的内存量 (Kbytes)
TTY—————该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
STAT————–该程序目前的状态
START ———–该 process 被触发启动的时间
TIME————–该 process 实际使用 CPU 运作的时间
COMMAND——该程序的实际指令[]内核态进程 无[] 用户进程
STAT基本状态 | 描述 | STAT状态+符号 | 描述 |
---|---|---|---|
R | 进程运行 | s | 进程是控制进程, Ss进程的领导者,父进程 |
S | 可中断睡眠 | < | 进程运行在高优先级上,S<优先级较高的进程 |
T | 进程被暂停 | N | 进程运行在低优先级上,SN优先级较低的进程 |
D | 不可中断睡眠 | + | 当前进程运行在前台,R+该表示进程在前台运行 |
Z | 僵尸进程 | l | 进程是多线程的,Sl表示进程是以线程方式运行 |
案例1:
1)在终端1运行vim
[root@b13k ~]#vim 1234.txt
2)在终端2上运行ps命令查看状态
[root@b13k ~]#ps -axu |grep vim
root 35876 0.0 0.5 149496 5256 pts/1 S+ 14:38 0:00 vim 1234.txt
root 35928 0.0 0.0 112808 960 pts/0 R+ 14:39 0:00 grep --color=auto vim
3)在终端1上挂起vim命令按下:ctrl + z
4)回到终端2再次运行ps命令查看状态
[root@b13k ~]#ps -aux|grep vim
root 1420 0.0 0.5 149492 5264 pts/0 T 14:54 0:00 vim 1234.txt
root 1424 0.0 0.0 112808 956 pts/1 R+ 14:55 0:00 grep --color=auto vim
案例2:
PS命令查看不可中断状态进程
使用tar打包文件时,可以通过中断不断查看状态,由S+,R+变为D+
[root@b13k ~]# ps axu|grep tar|grep -v grep
root 14289 2.6 0.1 124268 1888 pts/2 S+ 14:58 0:01 tar zcf etc.tar.gz /etc/ /usr/ /var
[root@b13k ~]# ps axu|grep tar|grep -v grep
root 14289 2.7 0.2 124380 2240 pts/2 R+ 14:58 0:01 tar zcf etc.tar.gz /etc/ /usr/ /var
[root@b13k ~]# ps axu|grep tar|grep -v grep
root 14289 2.9 0.2 124916 2724 pts/2 D+ 14:58 0:01 tar zcf etc.tar.gz /etc/ /usr/ /var
使用top命令动态查看当前的进程状态
[root@b13k ~]#top
top - 15:04:44 up 20 min, 2 users, load average: 0.00, 0.01, 0.02
Tasks: 95 total, 2 running, 92 sleeping, 1 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995684 total, 770580 free, 118024 used, 107080 buff/cache
KiB Swap: 2047996 total, 2047996 free, 0 used. 745704 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6 root 20 0 0 0 0 S 0.3 0.0 0:00.09 ksoftirqd/0
800 root 20 0 231548 6388 5024 R 0.3 0.6 0:02.15 vmtoolsd
1 root 20 0 125900 4376 2576 S 0.0 0.4 0:01.17 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
Tasks: 95 total———当前进程的总数
2 running —————正在运行的进程数
92 sleeping————–睡眠的进程数
1 stopped —————停止的进程数
0 zombie—————–僵尸进程数
%Cpu(s): 0.0 us ——系统用户进程使用CPU百分比
5.7 sy ——————–内核进程占用CPU百分比,内核是于硬件进行交互
45.2 id——————–空闲CPU的百分比
0.0 ni———————用户进程空间内改变过优先级的进程占用CPU百分比
0.0 wa——————–CPU等待IO完成的时间
0.0 hi———————硬中断,占的CPU百分比
0.0 si———————软中断,占的CPU百分比
0.0 st———————比如虚拟机占用物理CPU的时间
什么是中断?
中断就是终止当前在做的事情 去执行另一段程序
会保留现场,执行的那段程序做完之后会在回来执行刚来尚未完成的部分
跟人类似,CPU也要面对这样复杂的局面,意外是无处不在的-有可能是用户等的不耐烦,猛敲键盘,有可能网卡突然接收到一个新的数据库包,这些都是需要CPU具体情况具体分析,要么马上处理,要么暂缓响应,无论如何应对,都需要CPU暂停手头的工作,拿出一种对策,只有在响应之后,方能回头完成先前的使命 有了中断CPU才有并行处理能力
软中断和硬中断的区别
软中断 | 硬中断 | |
---|---|---|
是否有随机性 突发性 | 否 | 是 |
是否有中断响应周期 | 无 | 是 |
中断类型号的提供方法 | 固定或由指令提供 | 由中断控制器提供 |
什么是CPU上下文切换
CPU在不同的任务之前切换需要保存任务的运行资源记录:CPU得知道从哪里去加载任务,又从哪里开始运行所以需要用到CPU寄存器和程序计数器。在理解上面的基础上CPU上下文切换就是保存上一个任务运行的寄存器和计数器信息切换到加载下一个任务的寄存器和计数器的过程
管理进程状态 kill、killall、pkill
使用kill –l列出当前系统所支持的信号
[root@b13k ~]#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
虽然Linux信号很多,但是我们仅仅使用最常用的3个信号
- SIGHUP 重新加载配置文件 1
kill -1 实际执行reload操作,并不会关闭进程 - SIGKILL 强制杀死进程 9
kill -9 会直接关闭进程,进程在结束后不能自我清理,导致系统资源无法正常释放 - SIGTERM 终止进程,默认kill使用该信号 15
kill -15的效果是正常退出进程,退出前可以被阻塞或回调处理
Linux系统中killall,pkill命 令用于杀死指定名字的进程,我们可以使用kill命令杀死指定进程的PID的进程,killall和pkill直接杀进程而不需要查pid
killall命令, 杀死同一进程组内的所有进程,其允许指定要终止的进程的名称,而非PID
使用killall直接杀死进程
[root@b13k ~]# killall sleep
pkill是ps命令和kill命令的结合,pkill和killall应用方法差不多,按照进程名来杀死指定进程组,pkill可以踢出用户登录也可以踢出虚拟终端
使用pkill直接杀死进程
[root@b13k ~]# pkill sleep
使用pkil踢出用户
[root@b13k ~]#ps aux | grep ahui
root 1504 0.0 0.2 191880 2336 pts/2 S 15:55 0:00 su - ahui
ahui 1505 0.0 0.2 116336 2772 pts/2 S+ 15:55 0:00 -bash
root 1535 0.0 0.0 112808 956 pts/0 R+ 15:55 0:00 grep --color=auto ahui
[root@b13k ~]#pkill -kill -U ahui
[root@b13k ~]#ps aux | grep ahui
root 1552 0.0 0.0 112808 956 pts/0 R+ 15:56 0:00 grep --color=auto ahui
使用pkill踢出从远程登录到本机的用户,终止pts1上所有进程,用户强制退出
[root@b13k ~]# pkill -9 -t pts/1 #-9 == -kill
管理后台进程
什么是后台进程
进程都会在终端前台运行,一旦关闭终端,进程随着结束,此时希望进程在后台运行不退出,这样关闭终端也不影响进程的正常运行
如何把程序放在后台
把进程放入后台运行 使用 &
[root@b13k ~]#sleep 60000 &
[1] 1556
ctrl + z把进程挂起放在后台
[root@b13k ~]#sleep 50000
^Z
[2]+ Stopped sleep 50000
使用 jobs 查看在后台运行的程序
[root@b13k ~]#jobs
[1]- Running sleep 60000 &
[2]+ Stopped sleep 50000
使用 bg 让作业2在后台运行
[root@b13k ~]#bg %2
[2]+ sleep 50000 &
[16:13:19 root@b13k ~]#jobs
[1]- Running sleep 60000 &
[2]+ Running sleep 50000 &
使用 fg 将作业1掉回到前台运行
[root@b13k ~]#fg %1
sleep 60000
使用 kill 终止后台PID为2的进程
[root@b13k ~]#kill %2
[root@b13k ~]#jobs
[1]+ Stopped sleep 60000
[2]- Terminated sleep 50000
使后台运行的进程不再输出到屏幕
[root@b13k ~]#for i in {1..10};do echo $i;done &
[1] 1562
[16:22:40 root@b13k ~]#1 #在后台运行时输出到屏幕
2
3
4
5
6
7
8
9
#不论命令成功或失败都输出到空
[root@b13k ~]#for i in {1..10};do echo $i;done &> /dev/null &
[8] 1570
[6] Done for i in {1..10};
do
echo $i;
done
[7] Done > /dev/null
[root@b13k ~]#
screen
Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。
只要Screen本身没有终止,在其内部运行的会话都可以恢复。
screen需要安装
yum -y install screen
使用方式:
1)screen 指定一个任务名称后进入到一个新bash中
[root@b13k ~]# screen -S wget_mangodb
2)在新bash中执行一条下载命令
[root@b13k ~]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.13.tgz
3)使用如果ctrl + a + d 平滑退出screen任务,如果使用exit则退出screen
4)使用-list参数查看正在运行的screen有哪些任务
[root@b13k ~]#screen -list
There is a screen on:
1592.wget_mongodb (Detached)
1 Socket in /var/run/screen/S-root.
5)使用-r参数进入正在执行的screen任务中 或者使用PID即可进入
[root@b13k ~]# screen -r wget_mangodb
nohup
使用nohup 不需要安装
nohup会不挂断地运行命令
nohup默认会在当前执行命令的位置生成一个nohup.out文件
会接收程序运行中产生的所有的内容
让服务进程放在后台持续不断的运行
预备文件
[16:54:20 root@b13k ~]#cat test.sh
for i in {1..10};do echo $i;done
[16:54:20 root@b13k ~]#cat test1.sh
for i in {11..20};do echo $i;done
nohup 放在后台执行的命令 &
[16:54:06 root@b13k ~]#nohup sh test.sh &
[1] 1644
[16:54:13 root@b13k ~]#nohup: ignoring input and appending output to ‘nohup.out’
[1]+ Done nohup sh test.sh
[16:54:13 root@b13k ~]#cat nohup.out
1
2
3
4
5
6
7
8
9
10
写入脚本
[root@b13k ~]#cat start_test.sh
nohup sh test.sh &
nohup sh test1.sh &
启动
[root@b13k ~]#sh start_test.sh
[root@b13k ~]#nohup: appending output to ‘nohup.out’
nohup: appending output to ‘nohup.out’
^C
[17:02:05 root@b13k ~]#cat nohup.out
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
进程的优先级
1)在启动进程时,为不同的进程使用不同的调度策略
nice 值越高 表示优先级越低,例如+19 该进程容易将CPU使用量让给其他进程
nice值越低 表示优先级越高,例如-20, 改进程更不倾向于让出CPU
使用top或ps命令查看进程的优先级
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 125900 4376 2576 S 0.0 0.4 0:01.17 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
# 使用top可以查看nice优先级 NI:实际nice级别,默认是0 动态修正CPU调度。范围(-20~19)。越大,cpu调度越一般,越小,cpu调度越偏向它。一般用于后台进程,调整也是往大了调,用来给前台进程让出CPU资源
PR: 优先级 显示nice值,PR默认是20,越小,优先级越高。修改nice可以同时修改PR -20映射到0, +19映射到39
使用ps查看进程优先级
2)nice指定程序的优先级,语法格式nice -n 优先级数字 进程名称
# 开启vim并指定程序优先级为-5 并查看进程优先级
# renice命令修改一个正在运行的进程优先级,语法格式 renice –n 优先级数字 进程 pid
-
查看sshd进程当前的优先级状态
[root@lzy ~]# ps axo pid,command,nice|grep sshd 1114 /usr/sbin/sshd -D 0 30865 sshd: root@pts/0 0
-
调整sshd主进程的优先级
[root@lzy ~]# renice -n -20 1114 1114 (process ID) old priority 0, new priority -20
exit 退出当前bash
登陆查看调整或的优先级 再次登陆后会由主进程fork子进程 子进程会继承主进程的优先级[root@lzy ~]# ps axo pid,command,nice|grep sshd 1114 /usr/sbin/sshd -D -20 43747 sshd: root@pts/0 -20 43770 grep --color=auto sshd -20
小结
- 进程基本概述
- 使用ps命令静态查看当前的进程状态
ps -auxf常用组合方式查看进程、PID、占用cpu百分比,占用内存百分比,状态、执行的命令等
-a显示所有终端机下执行的进程,除了阶段作业领导者之外
-u以用户为主的格式来显示进程状况
-x显示所有进程,不以终端机来区分
-f用ASCII字符显示树状结构,表达进程间的相互关系 - 什么是中断?
中断就是终止当前在做的事情 去执行另一段程序
会保留现场,执行的那段程序做完之后会在回来执行刚来尚未完成的部分 - kill、killall 、pkill
kill-1 实际执行reload操作,并不会关闭进程
kill -9 会直接关闭进程,进程在结束后不能自我清理,导致系统资源无法正常释放
kill-15的效果是正常退出进程,退出前可以被阻塞或回调处理,默认kill使用该信号 15
killall 杀死同一进程组内的所有进程,其允许指定要终止的进程的名称,而非PID
pkill是ps命令和kill命令的结合,pkill和killall应用方法差不多,按照进程名来杀死指定进程组,pkill可以踢出用户登录也可以踢出虚拟终端 - 如何把程序放在后台?
在结尾加上&会把进程放入后台运行
ctrl + z把进程挂起放在后台 - screen
Screen可以看作是窗口管理器的命令行界面版本。
-r 进入正在执行的screen
-list 查看正在运行的screen - nohup
不挂断地运行命令 - 进程的优先级
nice 值越高 表示优先级越低
nice值越低 表示优先级越高
调整优先级:renice -n nice级别 pid