什么是进程
进程是已启动的可执行程序的运行实例,进程有以下组成部分
分配内存,已分配内存的地址空间
安全属性,进程的运行身份和权限
进程代码,运行一个或多个的线程
进程状态,进程运行后的多种状态
静态状态,二进制文件,静态,/usr/bin/ls,/usr/sbin/sshd
动态进程,程序运行的过程,有生命周期及运行状态
进程的运行环境,包括以下几个部分:
局部和全局变量
当前的调度上下文
分配给进程使用的系统资源
给进程分配对应的PID.PPID
进程的生命周期
父进程复制自己的地址空间创建新的子进程,子进程可以继承父进程PPID
的环境
每个进程都有自己 自己唯一的PID
进程是有systemd这个父进程派生出来的的子进程
子进程在运行自己的程序代码的时候,父进程往往会进入到睡眠状态。
子进程完成程序代码发出退出请求
子进程已经关闭了其资源环境,剩余的部分称之为僵停(僵尸Zombie)
父进程在子进程退出时收到信号会被唤醒,清理剩余的结构,然后继续执行自己的程序代码。
监控和管理进程
在多任务处理的操作系统中,每个cpu在一个时间点上只能处理一个进程。
在进程运行时,它对cpu时间和资源分配的要求会不断的变化,从而进程为分配一个状态,
静态查看进程通常使用ps
命令
了解进程如下选项:
PID,PPID
当前的进程状态
内存的分配情况
CPU的已花费的时间
用户UID决定进程的特权
[root@hjh ~]# `ps aux | less`
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.1 125312 3780 ? Ss 13:46 0:02 /usr/lib/systemd/systemd --switched-r
`USER: 运行进程的用户`
`PID: 进程ID`
`%CPU: CPU 实际占用率`
`%MEU 内存占用路`
`VSZ: 占用虚拟内存`
`RSS: 占用实际内存`
`TTY: 进程运行的终端 `
`STAT: 进程状态 man ps (/STATE)`
` R 进程运行
` S 可中断睡眠
` D 不可中断睡眠
` Z 僵尸进程
X 进程已退出
T 进程被暂停
Ss s 进程的领导者,父进程
S< < 优先级较高的进程
SN N 优先级较低的进程
R+ + 表示前台的进程组
SL 以线程的方式运行
START: 进程的启动时间
TIME: 进程占用CPU的总时间
COMMAND 进程文件,进程名
`
-
动态监控进程
系统负载的计算和意义
进程以及子进程和线程所产生的计算机产生的计算机指令会排成一个队列,系统负载就是cpu将要运行的进程所组成的队列的总和。
[root@hjh ~]# w
15:57:49 up 26 min, 1 user, load average: 0.02, 0.02, 0.03
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 15:55 5.00s 0.02s 0.00s w
//我当前虚拟机的cpu的核心数1核,当前负载是0.02
0.02(负载)/1(核心数) = 2%的cpu资源被占用,剩下都是free的。
LInux有两个特殊的设备文件
/dev/zero 无穷大文件
/dev/null 黑洞文件
top进程的优先级
nice
priority
值越小, 越优先
0 FIFO 先进先出 first input first output
-20 RR
20
可以通过nice
命令来指定优先级,默认是10.
企业流量的优先级
音频
视频
信号管理进程
使用kill命令发送信号与进程通信
定义守护进程的角色
结束用户会话和进程
命令有kill,killall,pgrep,pkill
[root@hjh ~]# 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
......
//常用到1(平滑重启,不改变进程信息,在我们的平时生产中最好就是用这种方式,一般用于非系统服务 )
正常关闭程序的方式:
systemctl stop 进程
kill 进程ID(如果要杀死一个服务的所有进程,需要找到父ID进程)
killall 进程名(推荐使用killall ,因为可以杀死与进程名有关的所有终端)
pkill :
-u 指定用户提出终端
-t:指定某个终端关闭其终端上所有的进程
-t -9:功能同 -u
pgrep -l -u 用户名(列出用户所有的进程)
程序本身的关闭方法
后台管理进程
作业控制是一个命令行功能,允许一个shell实例l来运行和管理多个命令。
如果没有作业控制,父进程fork()
一个子进程之后,将sleeping,直到子进程退出。
使用作业控制,可以选择性暂停,恢复,以及异步运行命令,让shell可以在子进程运行期间返回接受其他命令。
前台进程,后台进程 jobs,bg,fg
crtl+Z , ctrl+C
sleep
:这个命令是相当于暂停键,后面的时间接时间(秒),后面如果接&
符号表示放在后台运行。
[root@hjh ~]# sleep 2000 //相当于一个暂停命令,后面接秒数
^Z
[root@hjh ~]# sleep 1000 & //后面多个 & 表示在后台运行
[root@hjh ~]# jobs //查看后台作业
[1]- Running sleep 1000 &
[2]+ Stopped sleep 2000
[root@hjh ~]# bg %2 //运行在后台sleep的命令
[2]+ sleep 2000 &
[root@hjh ~]# jobs
[1]- Running sleep 1000 &
[2]+ Running sleep 2000 &
[root@hjh ~]# kill %1
[root@hjh ~]# jobs
[1]- Terminated sleep 1000
[2]+ Running sleep 2000 &
[root@hjh ~]# jobs
[2]+ Running sleep 2000 &
已经命令运行时间很长
cmd & //将进程调到后台运行
未知命令运行时间
cmd
ctrl + z //将命令sleep放入后台
bg % 序号 //将命令在后台运行起来,序号通过 jobs 来查看
kill % 序号 //干掉后台进程
[root@hjh ~]# (while :; do date; sleep 2; done) &
[3] 1241
[root@hjh ~]# Sat Dec 28 13:21:05 CST 2019
Sat Dec 28 13:21:07 CST 2019
Sat Dec 28 13:21:09 CST 2019
Sat Dec 28 13:21:11 CST 2019
Sat Dec 28 13:21:13 CST 2019
[root@hjh ~]# (while :; do date; sleep 2; done) & >/dev/null &
[3] 1325
[4] 1326
[root@hjh ~]# Sat Dec 28 13:23:12 CST 2019
Sat Dec 28 13:23:14 CST 2019