这里写目录标题
进程基本概述
1.什么是进程
***我们将运行的程序叫进程***
ls pwd cd 静态的文件 一段代码存储在磁盘中
命令运行中 称为进程
PS1:当程序运行为进程后,系统会为该进程分配内存,以及进程运行的身份和权限
PS2:在进程运行的过程中,服务器上会有各种状态来表示当前进程的指标信息
2.程序与进程的区别
程序是数据和指令的集合,是一个静态的概念,比如/bin/ls /bin/cp 等二进制文件,同时程序可以长期存在系统中
进程是程序运行的过程,是一个动态的概念,进程是存在生命周期概念的,也就是说进程随着程序的终止而销毁,不会永久存在系统中
3.进程的生命周期
一个对象从无到有、从有到无过程称为生命周期
(就绪态 执行态 僵死态 停止态 睡眠态)
当父进程接收到任务调度时,会通过fock派生子进程来处理,子进程会继承父进程衣钵(相当于完全复制了一份父进程的信息)
1.子进程在处理任务代码时,父进程会进入等待状态中
2.子进程在处理任务代码后,会执行退出,然后唤醒父进程来回收子进程的资源
3.如果子进程在处理任务过程中,父进程退出,子进程没有退出,子进程没有被父进程管理,则变为僵尸进程
4.每个进程都有自己的PID号,子进程称为PPID
监控进程状态
程序在运行后,我们需要了解进程的运行状态,
查看进程的状态分为:静态和动态两种方式
1.使用ps命令查看当前的进程状态(静态)
ps –auxf常用组合方式查看进程、PID、占用cpu百分比,占用内存百分比,状态、执行的命令等
-a显示所有终端机下执行的进程,除了阶段作业领导者之外
-u以用户为主的格式来显示进程状况
-x显示所有进程,不以终端机来区分
-f用ASCII字符显示树状结构,表达进程间的相互关系
----标志 | -------意义 |
---|---|
USER | 该 process 属于那个使用者账号的 |
PID | 该 process 的号码 |
%CPU | 该 process 使用掉的 CPU 资源百分比 |
%MEM | 该 process 所占用的物理内存百分比 |
VSZ | 该 process 使用掉的虚拟内存量 (Kbytes) |
RSS | 该 process 占用的固定的内存量 (Kbytes) |
TTY | 该 process 是在哪个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。 |
STAT | 该程序目前的状态 |
START | 被触发启动的时间 |
TIME | 该 process 实际使用 CPU 运作的时间 |
COMMAND | 该程序的实际指令[]内核态进程 无[] 用户进程 |
2.案例
1)在终端1上运行vim
1.在终端1上运行vim
2.在终端2上运行ps命令查看状态
[root@alex ~]#vim test
[root@alex ~]#ps -aux |grep vim|grep -v grep
root 10807 0.3 0.5 149396 5256 pts/0 S+ 16:01 0:00 vim test
3)在终端1上挂起vim命令按下: ctrl+z
4) 回到终端2再次运行ps命令查看状态
[root@alex ~]#ps -aux |grep test|grep -v grep
root 10807 0.0 0.5 149396 5256 pts/0 T 16:01 0:00 vim test
2).PS命令查看不可中断状态进程
使用tar打包文件时,可以通过中断不断查看状态,由S+,R+变为D+
[root@lzy ~]# ps axu|grep tar|grep -v grep
root 14289 2.6 0.1 124268 1888 pts/2 S+ 10:56 0:01 tar zcf etc.tar.gz /etc/ /usr/ /var
[root@lzy ~]# ps axu|grep tar|grep -v grep
root 14289 2.7 0.2 124380 2240 pts/2 R+ 10:56 0:01 tar zcf etc.tar.gz /etc/ /usr/ /var
[root@lzy ~]# ps axu|grep tar|grep -v grep
root 14289 2.9 0.2 124916 2724 pts/2 D+ 10:56 0:01 tar zcf etc.tar.gz /etc/ /usr/ /var
3.使用top动态查看进程状态
任务 | 含义 |
---|---|
Tasks:73 total | T当前进程的总数 |
2 running | 正在运行的进程数 |
71 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
%Cpu(s): 49.2 us | 系统用户进程使用CPU百分比 |
5.7 sy | 内核进程占用CPU百分比,内核是于硬件进行交互 |
ni | 优先调度进程占用CPU的时间 |
45.2 id | 空闲CPU的百分比 |
0.0 wa | CPU等待IO完成的时间 |
0.0 hi | 硬中断,占的CPU百分比 |
0.0 si | 软中断,占的CPU百分比 |
0.0 st | 比如虚拟机占用物理CPU的时间 Linux虚拟化 KVM |
1).什么是中断?
中断就是终止当前在做的事情 去执行另一段程序
会保留现场,执行的那段程序做完之后会在回来执行刚来尚未完成的部分
软中断与硬中断
//简单理解软中断与硬中断
执行下载视频任务
--CPU开始执行这个任务
--中间突然来了第二个任务
--此时硬中断去处理第二个任务
--第二个任务完成后回到第一个任务的场景
--此时由软中断接手第一个未完成的任务
-------
小文件过多会影响CPU性能
原因就是任务过多,不断的硬中断和软中断
下面展示一些 top的参数选项
。
top
h # 查看帮助
1 # 数字1,显示所有CPU核心的负载
z # 以高亮显示数据
b # 高亮显示处于R状态的进程
M # 按内存使用百分比排序输出
P # 按照CPU使用百分比排序输出
q # 退出top
管理进程状态
当程序运行为进程后,如果希望停止进程,怎么办呢?那么此时我们可以使用linux的kill命令对进程发送关闭新号,当然除了kill 还有killall pkill
1)使用kill –l列出当前系统所支持的信号
虽然Linux信号很多,但是我们仅仅使用最常用的3个信号
1)SIGHUP 重新加载配置文件 1 类似于reload
2)SIGKILL 强制杀死进程 9
3)SIGTERM 终止进程,默认kill使用该信号 15
[root@alex ~]# ps axu|grep nginx
root 15688 0.0 0.1 87384 1132 ? Ss 12:19 0:00 nginx: master process /usr/sbin/nginx
nginx 15689 0.0 0.3 89096 3176 ? S 12:19 0:00 nginx: worker process
root 15691 0.0 0.0 112660 968 pts/3 R+ 12:19 0:00 grep --color=auto nginx
# 发送重新加载信号 nginx配置文件发生改变,可用此重新加载
[root@alex ~]# kill -1 15688
[root@lzy ~]# ps axu|grep nginx
nginx 15692 0.0 0.3 89376 3648 ? S 12:19 0:00 nginx: worker process
root 15722 0.0 0.0 112660 968 pts/3 R+ 12:20 0:00 grep --color=auto nginx
#发送停止信号 kill pid
[root@alex ~]# kill 15692
#强制终止服务
kill -9 15692
2.Linux系统中killall,pkill命令用于杀死指定名字的进程,我们可以使用kill命令杀死指定进程的PID的进程,killall和pkill直接杀进程而不需要查pid
[root@alex ~]# killall nginx
[root@alex ~]# pkill nginx
#使用pkill踢出从远程登录到本机的用户,终止pts1上所有进程,用户强制退出
[root@alex ~]# pkill -9 -t pts/1
#pkill和killall不好用 杀不掉进程 使用进程号的方式才能杀
#如何批量杀死httpd所有的进程号
[root@alex ~]# ps axu|grep -v grep|grep httpd|awk '{print $2}'|xargs kill -9
管理后台进程
1)什么是后台进程
进程会在终端前台运行,一旦关闭终端,进程随着结束,此时希望进程在后台运行不退出,这样关闭终端也不影响进程的正常运行
2)如何把程序放在后台
# 把进程放入后台运行 使用 &
[root@alex ~]# sleep 3000 &
[1] 15909
# 把进程挂起放在后台
[root@alex ~]# sleep 4000
[3]+ Stopped sleep 4000 [root@lzy ~]#
# jobs 显示在后台运行的程序
[root@alex ~]# jobs
[1]- Running sleep 3000 &
[2]+ Running sleep 4000 &
# 让作业2在后台运行
[root@alex ~]# bg %2
[2]+ sleep 4000 &
[root@alex ~]# jobs
[1]- Running sleep 3000 &
[2]+ Running sleep 4000 &
将作业1掉回到前台运行
[root@alex ~]# fg %1
sleep 3000
# 终止后台PID为2的进程
[root@alex ~]# kill %2
[root@alex ~]# jobs
[1]+ Stopped sleep 3000
[2]- Terminated sleep 4000
# & 后台运行
for i in {1..10};do echo $i;done & # 内容还是输出到屏幕
for i in {1..10};do echo $i;done &>/dev/null & # 内容定向到空
screen的使用 常用
1)安装
yum –y install screen
2) 使用方法
#screen 指定一个任务名称后进入到一个新bash中
screen -S wget_jenkins
# 在新bash中执行一条下载命令
wget https://pkg.jenkins.io/redhat-stable/jenkins-2.190.1-1.1.noarch.rpm
# 平滑退出screen 不会终止任务,如果使用exit则退出
ctrl+a+d # 平滑退出screen任务
# 查看正在运行的screen有哪些任务
[root@alex ~]# screen -list
There is a screen on:
43698.wget_jenkins (Detached)
1 Socket in /var/run/screen/S-root.
# 进入正在执行的screen任务中 或者使用PID即可进入
[root@alex ~]# screen -r wget_jenkins
进程的优先级
1)在启动进程时,为不同的进程使用不同的调度策略
nice 值越高 表示优先级越低,例如+19 该进程容易将CPU使用量让给其他进程
nice值越低 表示优先级越高,例如-20, 该进程更不倾向于让出CPU
使用top或ps敏玲查看进程的优先级
#使用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
1)查看sshd进程当前的优先级状态
[root@lzy ~]# ps axo pid,command,nice|grep sshd
1114 /usr/sbin/sshd -D 0
30865 sshd: root@pts/0 0
2) 调整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
扩展: python程序
py aaa.py ccc.py bbb.py
如何启动py程序
nohup count.py –ip –port –redis –mysql &
nohup count.py &
nohup count.py &
nohup count.py &
写入shell脚本 执行运行shell脚本
停止py程序
ps axu|grep count.py|grep –v grep|awk ‘{print $2}’|xargs kill -9
写入pystop.sh
sh pystop.sh
原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用
nohup.out 注意大小