二十、shell进程管理与优先级、proc文件系统与僵尸进程

今日内容:
1、shell进程管理
	1>优先级设置
	2>给进程发信号
		kill
	3>HUP信号:如何让进城脱离当前终端运行
	nohup ping www.baidu.com &
	setsid ping www.baidu.com
 	(ping www.baidu.com &)
 	sceen 先切进窗口,再输命令,
 		-S指定别名
 		-ls查看
 		-r指定pid或别名运行
在子shell中提交任务
	screen命令
2、查看网络状态
3、proc文件系统
	查看硬盘状态
		df
	查看内存状态
		free
		查看CPU状态
		lscpu
4、管理后台进程(了解)
	jobs
	bg
	fg
7、管道
	补充:tee
8、僵尸进程与孤儿进程

一、shell进程管理

1、优先级设置

优先级的范围:-20~19 (共40个等级,-20为最高优先级)

若nice命令未指定优先级的调整值,则缺省值10来调整程序运行的优先级,即在当前程序运行优先级的基础上增加10;

可以在冷启动进程时,用nice命令设置优先级:

1>nice 设定优先级
格式:nice -n 数字 命令
选项
-n #原优先级基础上来增进
nice -n 2 vim #增进两个优先级

2>renice 重新指定优先级(新的)
renice -20 vim #指定为最高优先级
PS:renice只允许修改已运行进程的优先权

2、给进程发送信号

获取信号方式:

kill -l 	#字母l,列出所有支持的信号
kill pid号   #精准杀掉进程
pkill 进程名  #杀掉此进程的所有进程,含子进程
-l  #小写L,查看kill选项
-9  #强制杀死,一般root会用
-15 #程序释放相应资源,然后再停止
PS:在使用 kill -9 前,应该先使用 kill -15,给目标进程一个清理善后工作的机会。如果没有,可能会留下一些不完整的文件或状态,从而影响服务的再次启动。

3、信号解释

1>重新加载配置文件

kill -1 vim #数字1,来重新加载配置文件
示例:
1>默认匿名用户共享根目录为/var/ftp:
	[root@egon ~]# systemctl start vsftpd
	[root@egon ~]# ls /var/ftp/
	centos7 pub
2>启动浏览器,输入以下内容,看到的是/var/ftp下的内容:		ftp://192.168.12.42/
3>修改vsftpd配置文件,默认匿名用户共享根目录为/test:
	sed -i '$a anon_root=/test' /etc/vsftpd/vsftpd.conf
4>在不启动vsftpd服务的情况下让其加载配置文件:
	ps aux |grep [v]sftpd
	[root@egon ~]# ps aux |grep [v]sftpd
    root 50695 0.0 0.0 53288 780 ? Ss 11์01 0:00
    /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
    [root@egon ~]# kill -1 50695 
      #这期间vsftpd的pid始终是不变的,因为从未关闭过过程
    [root@egon ~]# ps aux |grep [v]sftpd
    root 50695 0.0 0.0 53288 780 ? Ss 11月01 0:00
    /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
5、打开浏览器,重新输入以下内容,看到的是/test下的内容:
	ftp://192.168.12.42/

2>kill杀死进程

#查看某个用户开启的进程
pgrep -lu egon
ping www.baidu.com &>/dev/null &放在后台,且丢入黑洞运行
kill -15 #不加-15,默认发出的就是-15的信号
    [root@egon ~]# ps aux |grep [v]sftpd
    root 50695 0.0 0.0 53288 780 ? Ss 11์01 0:00
    /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
    [root@egon ~]# kill 50695
    [root@egon ~]# ps aux |grep [v]sftpd

kill -9 #强制杀死
    [root@localhost ~]# ps aux |grep nginx
    root 29978 0.0 0.1 120896 2096 ? Ss 17:28 0:00 nginx:
    master process /usr/sbin/nginx
    nginx 29979 0.0 0.1 123364 3544 ? S 17:28 0:00 nginx:
    worker process
    root 29984 0.0 0.0 112724 988 pts/0 S+ 17:28 0:00 grep --
    color=auto nginx
    [root@localhost ~]# kill -9 29978
    [root@localhost ~]
    
kill -19 #暂停
    [root@egon ~]# kill -19 106530
    [root@egon ~]# ps aux |grep [v]sftpd
    root 106530 0.0 0.0 53288 572 ? Ts 21:17 0:00
    /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
    [root@localhost ~]
    
kill -18 #恢复    
    [root@egon ~]# kill -18 106530
    [root@egon ~]# ps aux |grep [v]sftpd
    root 106530 0.0 0.0 53288 572 ? Ss 21:17 0:00
    /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
    [root@localhost ~]

根据进程名,杀死所有进程!
pkill -9 vim    #杀死一类进程,该服务的所有进程
kill all -9 vim #杀死一类进程,该服务的所有进程

3>HUP信号

以下三种情况,终端会在结束前关闭所有子进程,注意,是彻底关闭终端,不仅仅是退出登录:

1>网络断开
2>退出登录
3>关闭终端

若想让进程一直在后台运行,不因为以上情况被干掉,有两种方案解决:

方案1:
让进程忽略Linux HUP信号(脱离当前窗口):
nohup ping www.baidu.com &>/dev/null & #nohup与最后&通常配合一起用
#执行完此命令,可直接关闭窗口,无序退出,还在运行...
或 setsid ping www.baidu.com &>dev/null #效果同上(ping www.baidu.com &>/dev/null &)
方案2:
让进程运行在新的会话里,从而不属于此终端的子进程,就不会被一起带走;
#再退出登陆一下,再关闭窗口即可
1>logout
2>exit

4>screen命令

方式一:开启一个窗口并启用-S指定窗口名,也可以不指定:
screen -S egon #-S
原理:screen将创建一个执行shell的全屏窗口,你可以指定任意shell程序,就像在ssh窗口中那样;否则screen自动切换到前一个窗口。
测试:打开终端
终端1运行:
[root@peng ~]# screen #窗口会闪一下,输入要执行的任务
[root@peng ~]# n=1;while true;do echo $n;sleep 1;((n++));done #如执行一个循环任务
再按ctrl+A,ctrl+D
关闭终端,程序会继续运行

然后在新终端运行:
[root@peng ~]# screen -ls #列出挂起的任务
There is a screen on:
        1918.egon       (Attached)
1 Socket in /var/run/screen/S-root.
[root@peng ~]# screen -r 1918 #执行任务的pid号即可看到运行的结果
[root@peng ~]# 1
[root@peng ~]# 2
[root@peng ~]# ...
PS:若使用了-S指定窗口名为egon,那么也可以screen -r egon来查看执行结果,效果一样,这样就无需用screen -ls去找进程的pid了。

方式二:screen命令后跟你要执行的程序:
screen vim test.txt
ctrl+c或z强制结束,再退出登录的话,jobs查看任务还在运行,若继续运行同上
#screen创建一个执行vim test.txt的单窗口回话,退出vim将退出该窗口/会话

原理:screen程序会帮我们管理运行的命令,退出screen,命令还继续运行;若关闭screen所在的终端,则screen程序的ppid变为1,所以screen不会死掉,对应着它帮我们管理的命令也不会退出。

5>netstat命令

概念:显示网络状态,此命令可得知整个linux系统的网络情况

语法格式
netstat 选项 参数
选项
-t #tcp协议
-u #udp协议
-l #listen
-p #pid/Program name
-n #不反解,不将IP地址解析为主机名(80--->http)

不加选项:
[root@peng ~]# netstat |head
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0     52 peng:ssh                192.168.181.1:53739     ESTABLISHED
udp        0      0 peng:33882              public1.alidns.c:domain ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  3      [ ]         DGRAM                    8976     /run/systemd/notify
unix  2      [ ]         DGRAM                    8978     /run/systemd/cgroups-agent

查看tcp协议网络状态
[root@peng ~]# netstat -t
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0     52 peng:ssh                192.168.181.1:53739     ESTABLISHED

查看udp协议网络状态
[root@peng ~]# netstat -u
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
udp        0      0 peng:33882              public1.alidns.c:domain ESTABLISHED
[root@peng ~]# 

6>proc

查看系统状态全是在/proc下
df	   #查看文件系统占用资源状态,默认以字节显示
df -h  #以M为单位
df -T  #指定为文件系统

du -sh #统计当前目录大小
du -sh /tmp

free #查看内存使用情况
-b  #以Byte为单位显示内存使用情况
-k  #以KB为单位显示内存使用情况
-m  #以MB为单位显示内存使用情况
-h  #以合适的单位显示内存使用情况,k;M;G;推荐使用wh
-w   #把buffer和cache分开查看
[root@peng ~]# free -wh
              total        used        free      shared     buffers       cache   available
Mem:           972M        125M        524M        7.6M        1.0M        321M        681M
Swap:          767M          0B        767M

sync    #释放前多同步几次
echo 3 > /proc/sys/vm/drop_caches #释放缓存
free -w #再次查看

cat /proc/cpuinfo |grep cpu #过滤CPU信息
cpu family      : 6
cpu MHz         : 2594.113
cpu cores       : 1
cpuid level     : 13

5>管理后台进程

jobs #查看后台进程与对应的序列号
fg %2 #把后台进程调到前台运行
bg$  #让后台暂停的进程继续运行
[root@peng ~]# jobs
[1]+  Stopped                 vim 2.txt
[root@peng ~]# bg %1
[1]+ vim 2.txt &
[root@peng ~]# fg %1	#调到前台运行

[root@peng ~]# ping www.baidu.com &> /tmp/ecccess.log &
[4] 2799
[root@peng ~]# jobs
[1]+  Stopped                 vim 2.txt
[2]   Running                 ping www.baidu.com &>/tmp/ecccess.log &
[3]   Running                 ping www.baidu.com &>/tmp/ecccess.log &
[4]-  Running                 ping www.baidu.com &>/tmp/ecccess.log &
[root@peng ~]# tailf /tmp/ecccess.log 
64 bytes from 112.80.248.75 (112.80.248.75): icmp_seq=27 ttl=128 time=10.8 ms
64 bytes from 112.80.248.75 (112.80.248.75): icmp_seq=28 ttl=128 time=13.2 ms
...

ifconfig | tee a.txt #将ifconfig的内容打印,并写道a.txt内

6>管道

概念:

用于进程之间通信

详细的说:主要用来连接左右的两个命令,将左侧的命令标准输出,交给右侧命令的标准输入。

例:过滤出httpd
[root@peng ~]# ps aux |grep "httpd"
root       5881  0.0  0.0 112808   968 pts/0    R+   21:19   0:00 grep --color=auto httpd
例:打印passwd倒数三行中含nginx的行
[root@peng ~]# cat /etc/passwd |tail -3 |grep 'nginx'
nginx:x:997:995:nginx user:/var/cache/nginx:/sbin/nologin
例:打印当前所有ip
[root@peng ~]# ip a |grep 'inet ' |awk '{print $2}' |awk -F "/" '{print $1}'
127.0.0.1
192.168.181.8
例:打印根分区已用空间的百分比,仅打印数字
df -P|grep '/$' |awk '{print $5}'|awk -F"%" '{print $1}'50

7>僵尸进程与孤儿进程

概念:Z来表示,指杀不死的进程,子进程为pid,父进程为ppid,僵尸进程占用pid号,留给父进程来看;

清理僵尸进程方法:

方案一:给父进程发信号,让其来回收僵尸进程(子进程残留)
kill -CHLD
若父进程不不响应,则执行方案二
方案二:
解决方案二:杀掉父进程,让systemd来接管僵尸进程即可

僵尸进程会占用pid号,内存、硬盘、CPU都够用,却启动不起来应用程序、原因就是pid号不够用了!

总结:

僵尸进程是linux系统处于好心设计的一种数据结构,一个子进程死掉后,相当于操作系统出于好心帮他们的父进程保存它的遗体,之所以会在某种场景下有害。是因为它的父进程不靠谱, 儿子(子进程)死了也不及时收尸(指的是发起系统调用,让操作系统收拾)

说白了,僵尸进程本身无害,有害的是那些水平不足的程序员,写出来的程序不完善,bug太多···

posted @ 2022-06-09 18:19  秋风お亦冷  阅读(66)  评论(0编辑  收藏  举报