今日内容:
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太多···