1. 服务开机自启动
/etc/rc.d/rc.local
:用于在系统启动时执行自定义命令或脚本。- 将服务的启动命令写入该文件即可,要有执行权限。
- Ubuntu:
/etc/rc.local。需要自己创建文件。
2. 进程
- 程序/软件运行后就是进程
- 进程在内存中运行
- 守护进程/服务:一直运行的进程
3. 僵尸进程
- 进程因为一些原因脱离系统控制,但是进程又没有正常退出,并一直占用系统的资源(cpu、内存),这种就是僵尸进程。
- 僵尸进程处于运行中但是不受控制。
- 僵尸进程要及时排查与处理,否则僵尸进程增多会导致系统大量资源被占用,系统负载变高。
3.1 处理僵尸进程
- kill或kill -9一般对僵尸进程是失效的,
kill
命令的作用是向进程发送信号(如SIGKILL
),但僵尸进程无法响应信号(因为它已经死了)。 - 结束僵尸进程的父进程:
- 1.如果僵尸进程的父进程是主进程(pid=1),则只能重启Linux(在业务低谷期)。
- 2.如果僵尸进程的父进程不是主进程,通过kill命令结束父进程即可。
3.2 查看僵尸进程
- top
- 过滤出系统中的僵尸进程
- 程序状态Z表示是僵尸进程
[root@oldboy99-Kylin ~]# ps aux |grep 'Z'
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 3927 0.0 0.0 0 0 pts/0 Z 17:47 0:00 [zombie] <defunct>
root 3937 0.0 0.0 213140 880 pts/0 S+ 17:50 0:00 grep --color Z
# 取第8列中含有‘Z’的行
[root@oldboy99-Kylin ~]# ps aux |awk '$8~/Z/'
root 3927 0.0 0.0 0 0 pts/0 Z 17:47 0:00 [zombie] <defunct>
3.2 排查与结束僵尸进程全流程
# 1.检查是否有僵尸进程
top
# 2.查看哪个进程是僵尸进程,记录下pid
ps aux |grep 'Z'
# 3.查看僵尸进程的上级进程
pstree -p
ps -ef # 查看第3列
# 4.如果上级进程不是主进程
kill + pid结束进程
4. 孤儿进程
- 某个子进程的父进程,因为特殊原因退出了,但是子进程还在。这个子进程就是孤儿进程。
- 对系统影响不大
- 解决:重启服务
5. 进程管理
5.1 kill三剑客
命令 | 说明 |
---|---|
kill | kill pid:结束对应的进程; kill -9:强制结束进程(-9是一种信号) |
pkill | 根据进程名字过滤结束进程,很有可能误杀进程 |
killall | 根据名字终结进程 |
5.2 后台运行
- 前台运行:命令在命令行中运行,无法执行其他命令。需要等待。
- 后台运行:一些命令在前台运行的时候连接断开或网络断开,前台运行的命令会结束。后台运行的命令则没有影响。
后台运行 | 说明 |
---|---|
命令 & | 后台运行,远程连接断开也会结束 |
nohup 命令 & | 后台运行,连接断开也不结束,默认会把结果输出到当前目录下nohup.out文件中 |
devops01@sunkexu-aliyun:~$ nohup ping qq.com >> qqlog.txt &
[1] 18148
devops01@sunkexu-aliyun:~$ nohup: ignoring input and redirecting stderr to stdout
devops01@sunkexu-aliyun:~$ tail -f qqlog.txt
PING qq.com (203.205.254.157) 56(84) bytes of data.
64 bytes from 203.205.254.157 (203.205.254.157): icmp_seq=3 ttl=44 time=124 ms
64 bytes from 203.205.254.157 (203.205.254.157): icmp_seq=5 ttl=44 time=124 ms
……
6. 进程监控命令
- ps:查看进程静态信息
- top:查看进程动态、静态信息
6.1 ps
6.1.1 ps -ef
6.1.2 ps aux
6.1.3 VSZ、RSS
1.swap是什么?
交换分区(虚拟内存):物理内存不足的时候,swap临时充当内存,防止系统崩溃。
2.VSZ,RSS 单位kb
VSZ(virtual size)表示系统内存总大小:swap+物理内存;
RSS表示实际物理内存大小。
6.1.4 进程状态
进程状态符(STAT) | 说明 |
---|---|
Z | zombie,僵尸进程 |
R | running,运行中 |
S | sleeping,睡眠状态。程序正在等待某个资源,一旦获取就会进入运行状态。 |
D | 不可中断的休眠;进程正在等待某些系统调用的完成(IO操作) |
T | 后台挂起(暂停)的进程(ctrl+z) |
+ | 前台运行的进程 |
s | 表示该进程是主进程 |
l | 表示该进程支持线程 |
< | 表示该进程拥有高优先级 |
6.1.5 进程、线程
- 进程:process,运行的程序或软件就相当于1个进程。进程就像一个公司,用于独立的资源(cpu/内存/文件)
- 线程:thread,线程是进程中的执行单元。线程就像公司中的一个一个的员工,共享公司的资源(内存/文件)
6.2 top
- top是交互式命令,不适合直接过滤
6.2.1 cpu使用情况的各种指标:
指标 | 单词 | 说明 |
---|---|---|
us | user | 用户程序占用的cpu时间百分比 |
sy | system | 系统内核程序占用的cpu时间百分比 |
ni | nice | 低优先级用户进程占用的cpu时间百分比 |
id | idle(空闲) | cpu空闲时间百分比 |
wa | iowait | cpu等待IO操作完成的时间百分比 |
hi | hardware irq(硬件中断) | 硬件中断(键盘、磁盘响应)占用的cpu时间百分比 |
si | software irq(软件中断) | 软件中断(如网络数据包处理)占用的cpu时间百分比 |
st | steal(偷走) | 虚拟机被宿主机‘偷走’的cpu时间百分比 (仅在虚拟环境出现,表示资源被其他虚拟机占用) |
6.2.2 top命令快捷键
快捷键 | 说明 |
---|---|
M | 按内存使用率排序 |
P | 按cpu使用率排序 |
空格 | 立刻更新 |
1 | 显示所有cpu核心的使用情况 |
z(小写),x(小写),用 <或> 选择列 | 显示颜色,可选择不同的列排序 |
6.3 htop
- 可直接用鼠标选择不同的列排序
7. ps、top应用案例
7.1 过滤出叫crond/sshd的进程
[root@oldboy99-Kylin ~]# ps -ef |grep -E 'sshd|crond'
root 842 1 0 12:58 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 862 1 0 12:58 ? 00:00:00 /usr/sbin/crond -n
root 883 842 0 12:58 ? 00:00:00 sshd: root [priv]
root 1154 883 0 12:58 ? 00:00:01 sshd: root@pts/0
root 1817 1159 0 14:51 pts/0 00:00:00 grep --color -E sshd|crond
- 执行当前命令也是一个进程,所以把当前命令也过滤出来了。
- 解决方法:使用正则表达式,将过滤参数的第一个字母加上中括号
[root@oldboy99-Kylin ~]# ps -ef |grep -E '[s]shd|[c]rond'
root 842 1 0 12:58 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 862 1 0 12:58 ? 00:00:00 /usr/sbin/crond -n
root 883 842 0 12:58 ? 00:00:00 sshd: root [priv]
root 1154 883 0 12:58 ? 00:00:01 sshd: root@pts/0
- 原理:加上中括号,就是[s]shd,就不会匹配sshd了。
7.2 过滤sshd进程数量
[root@oldboy99-Kylin ~]# ps -ef |grep -E 'sshd|crond' |grep -v 'grep' |wc -l
4
[root@oldboy99-Kylin ~]# ps -ef |grep -E '[s]shd|[c]rond' |wc -l
4
- 推荐直接使用方法二。
7.3 输出rsyslog进程的pid
[root@oldboy99-Kylin ~]# ps -ef |grep '[r]syslog' |awk '{print $2}'
891
7.4 top命令非交互模式与过滤指定内容
- top命令默认是交互模式便于展示结果,但是不方便进行过滤或查找。
- top -bn1 :非交互式模式,显示1次top信息
- -b:batch,显示当前所有信息
- -n:显示多少次
7.5 取出系统登录用户数量
[root@oldboy99-Kylin ~]# w |awk 'NR==1{print $4}'
1
[root@oldboy99-Kylin ~]# top -bn1 |grep 'user' |awk '{print $6}'
1
7.6 取出僵尸进程数量
[root@oldboy99-Kylin ~]# top -bn1 |grep 'zombie' |awk '{print $(NF-1)}'
0
8. 思维导图
【金山文档】 思维导图 https://www.kdocs.cn/l/co3I7PtpTYQX
9. 踩坑记录
9.1 为啥有些命令选项有没有‘-’都行(tar ,ps aux),而有些命令选项有无‘-’差异很大(ps -ef)?
- 选项前的‘-’表示语法分隔符,它的作用并不统一,而是受命令作者或不同命令语法标准的影响。
- GNU的命令强制规定加‘-’
- 早先unix风格的命令选项一般不加‘-’
9.2 ps -ef和ps ef的差别?
- ps -ef:显示所有进程及信息
- ps ef:以进程树的形式显示进程信息,一般不用