8.1 进程管理类
计算机中,一个正在执行的程序或者命令,被叫做“进程”(Process);前台进程,后台进程。
启动之后一直存在,常驻内存的进程,一般被称为“服务”(Service),往往是后台进程,然后执行具体系统服务的进程被称为“守护进程”。
进程是正在执行的一个程序或命令, 每一个进程都是一个运行的实体, 都有自己的地址空间, 并占用一定的系统资源。
8.1.1 ps 查看当前系统进程状态
ps :process status 进程状态
1)基本语法
:::info
ps aux | grep xxx (功能描述:查看系统中所有进程)
ps -ef | grep xxx (功能描述:可以查看子进程之间的关系)
:::
2)选项说明
选项 | 功能 |
---|---|
a | 列出带有终端的所有用户的进程 |
x | 列出当前用户的所有进程, 包括没有终端的进程 |
u | 面向用户友好的显示风格 |
-e | 列出所有进程 |
-u | 列出某个用户关联的所有进程 |
-f | 显示完整格式的进程列表 |
3)功能说明
(1) ps aux 显示信息说明
USER: 该进程是由哪个用户产生的
PID: 进程的 ID 号
%CPU: 该进程占用 CPU 资源的百分比, 占用越高, 进程越耗费资源;
%MEM: 该进程占用物理内存的百分比, 占用越高, 进程越耗费资源;
VSZ: 该进程占用虚拟内存的大小, 单位 KB;
RSS: 该进程占用实际物理内存的大小, 单位 KB;
[ 内核做内存页面置换的算法是 LRU最近最少使用规则 ]
TTY(teletypewriter): 该进程是在哪个终端中运行的。 对于 CentOS 来说, tty1 是图形化终端,tty2-tty6 是本地的字符界面终端。 pts/0-255 代表虚拟终端。
STAT: 进程状态。 常见的状态有: R: 运行状态、 S: 睡眠状态、 T: 暂停状态、Z: 僵尸状态、 s: 包含子进程、 l: 多线程、 +: 前台显示、<:进程优先级高、N:进程优先级低
START: 该进程的启动时间
TIME: 该进程占用 CPU 的运算时间, 注意不是系统时间
COMMAND: 产生此进程的命令名
(2) ps -ef 显示信息说明
UID: 用户 ID
PID: 进程 ID
PPID: 父进程 ID
C: CPU 用于计算执行优先级的因子。 数值越大, 表明进程是 CPU 密集型运算,执行优先级会降低; 数值越小, 表明进程是 I/O 密集型运算, 执行优先级会提高
STIME: 进程启动的时间
TTY: 完整的终端名称
TIME: CPU 时间
CMD: 启动进程所用的命令和参数
4)经验技巧
如果想查看进程的 CPU 占用率和内存占用率, 可以使用 aux;
如果想查看进程的父进程 ID 可以使用 ef;
5)案例实操
# 查看进程的CPU占用率和内存占用率
➜ ~ ps aux
# 查看进程的父进程ID
➜ ~ ps -ef
8.1.2 kill 终止进程
Linux kill 命令用于删除执行中的程序或工作。
kill 可将指定的信息送至程序。预设的信息为 SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用 SIGKILL(9) 信息尝试强制删除程序。程序或工作的编号可利用 ps 指令或 jobs 指令查看。
1)基本语法
:::info
kill [选项] 进程号 (功能描述:通过进程号杀死进程)
killall 进程名称 (功能描述:通过进程号杀死进程,也支持通配符,这在系统因负载过大而变得很慢的时很有用)
kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]
:::
2)选项说明
- -l <信息编号> 若不加<信息编号>选项,则 -l 参数会列出全部的信息名称。
- -s <信息名称或编号> 指定要送出的信息。
- [程序] [程序]可以是程序的PID或是PGID,也可以是工作编号。
使用 kill -l 命令列出所有可用信号。
最常用的信号是:
- 1 (HUP):重新加载进程。
- 9 (KILL):杀死一个进程。
- 15 (TERM):正常停止一个进程。
3)案例实操
(1)杀死浏览器进程
kill -9 5102
(2)通过进程名称杀死进程
killall firefox
8.1.3 pstree 查看进程树
Linux pstree(英文全称:display a tree of processes)) 命令将所有进程以树状图显示,树状图将会以 pid (如果有指定) 或是以 init 这个基本进程为根 (root),如果有指定使用者 id,则树状图会只显示该使用者所拥有的进程。
使用权限:所有使用者。
1)基本语法
:::info
pstree [选项]
pstree [-a] [-c] [-h|-Hpid] [-l] [-n] [-p] [-u] [-G|-U] [pid|user]
:::
2)选项说明
选项 | 功能 |
---|---|
-p | 显示进程的 PID |
-u | 显示进程的所属用户 |
3)案例实操
(1)显示进程PID
➜ ~ pstree -p
(2)显示进程所属用户
➜ ~ pstree -u
8.1.4 top 实时监控系统进程状态
Linux top命令用于实时显示 process 的动态。
使用权限:所有使用者。
1)基本命令
:::info
top [选项]
top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]
:::
2)选项说明
- d : 改变显示的更新速度,或是在交谈式指令列( interactive command)按 s
- q : 没有任何延迟的显示速度,如果使用者是有 superuser 的权限,则 top 将会以最高的优先序执行
- c : 切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称
- S : 累积模式,会将己完成或消失的子进程 ( dead child process ) 的 CPU time 累积起来
- s : 安全模式,将交谈式指令取消, 避免潜在的危机
- i : 不显示任何闲置 (idle) 或无用 (zombie) 的进程
- n : 更新的次数,完成后将会退出 top
- b : 批次档模式,搭配 “n” 参数一起使用,可以用来将 top 的结果输出到档案内 | 选项 | 功能 | | —- | —- | | -d 秒数 | 指定 top 命令每隔几秒更新。默认是 3秒在 top命令的交互模式当中可以执行的命令 | | -i | 使top不显示任何闲置或者僵死进程 | | -p | 通过指定监控进程 ID 来仅仅监控某个进程的状态 |
3)操作说明
操作 | 功能 |
---|---|
P | 以 CPU 使用率排序,默认就是此项 |
M | 以内存的使用率排序 |
N | 以 PID 排序 |
q | 退出top |
4)查询结果字段解释
第一行信息为任务队列信息
内容 | 说明 |
---|---|
12:26:46 | 系统当前时间 |
up 1 day, 13:32 | 系统的运行时间, 本机已经运行 1 天 13 小时 32 分钟 |
2 users | 当前登录了两个用户 |
load average: 0.00, 0.00, 0.00 | 系统在之前 1 分钟, 5 分钟, 15 分钟的平均负载。 一般认为小于 1 时, 负载较小。 如果大于1, 系统已经超出负荷。 |
第二行为进程信息
Tasks: 95 total | 系统中的进程总数 |
---|---|
1 running | 正在运行的进程数 |
94 sleeping | 睡眠的进程 |
0 stopped | 正在停止的进程 |
0 zombie | 僵尸进程。 如果不是 0, 需要手工检查僵尸进程 |
第三行为 CPU 信息
Cpu(s): 0.1%us | 用户模式占用的 CPU 百分比 |
---|---|
0.1%sy | 系统模式占用的 CPU 百分比 |
0.0%ni | 改变过优先级的用户进程占用的 CPU 百分比 |
99.7%id | 空闲 CPU 的 CPU 百分比 |
0.1%wa | 等待输入/输出的进程的占用 CPU 百分比 |
0.0%hi | 硬中断请求服务占用的 CPU 百分比 |
0.1%si | 软中断请求服务占用的 CPU 百分比 |
0.0%st | st( Steal time) 虚拟时间百分比。 就是当有虚拟机时, 虚拟 CPU 等待实际 CPU 的时间百分比。 |
第四行为物理内存信息
Mem: 625344k total | 物理内存的总量, 单位 KB |
---|---|
571504k used | 已经使用的物理内存数量 |
53840k free | 空闲的物理内存数量, 我们使用的是虚拟机, 总共只分配了 628MB 内存, 所以只有 53MB 的空闲内存了 |
65800k buffers | 作为缓冲的内存数量 |
第五行为交换分区(swap) 信息
Swap: 524280k total | 交换分区(虚拟内存) 的总大小 |
---|---|
0k used | 已经使用的交互分区的大小 |
524280k free | 空闲交换分区的大小 |
409280k cached | 作为缓存的交互分区的大小 |
5)案例实操
➜ ~ top -d 1
➜ ~ top -i
➜ ~ top -p 31568
执行上述命令后,可以按照 P,M,N 对查询出的进程结果进行排序。
:::warning
PID:当前进程的编号
USER:当前进程的运行的用户
PR:当前进程调度的优先级
NI:当前进程调度的用户指定的优先级(nice值)
VIRT:进程虚拟内存占用的大小
RES:进程实际物理内存占用的大小
SHR:进程共享内存占用的大小
S:进程当前的状态
%CPU:当前进程CPU运行的占用的百分比
%MEM:当前进程内存运行的占用的百分比
TIME+:当前进程运行的占用时间已经占用CPU运行的总时间的大小
COMMAND:生成当前进程运行的命令指令
:::
top 窗口按照不同的指标进行排序: Shift + M :按照%MEM内存从大到小排序 Shift + P :按照%CPU从大到小排序(默认按CPU排序) Shift + N :按照PID进行排序
8.1.5 netstat 显示网络状态和端口占用信息
Linux netstat 命令用于显示网络状态。
利用 netstat 指令可让你得知整个 Linux 系统的网络情况。
1)基本语法
:::info
netstat -anp | grep 进程号 (功能描述:查看该进程网络信息)
netstat -nlp | grep 端口号 (功能描述:查看网络端口号占用情况)
netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][—ip]
:::
2)选项说明
- -a或—all 显示所有连线中的Socket。
- -A<网络类型>或—<网络类型> 列出该网络类型连线中的相关地址。
- -c或—continuous 持续列出网络状态。
- -C或—cache 显示路由器配置的快取信息。
- -e或—extend 显示网络其他相关信息。
- -F或—fib 显示路由缓存。
- -g或—groups 显示多重广播功能群组组员名单。
- -h或—help 在线帮助。
- -i或—interfaces 显示网络界面信息表单。
- -l或—listening 显示监控中的服务器的Socket。
- -M或—masquerade 显示伪装的网络连线。
- -n或—numeric 直接使用IP地址,而不通过域名服务器。
- -N或—netlink或—symbolic 显示网络硬件外围设备的符号连接名称。
- -o或—timers 显示计时器。
- -p或—programs 显示正在使用Socket的程序识别码和程序名称。
- -r或—route 显示Routing Table。
- -s或—statistics 显示网络工作信息统计表。
- -t或—tcp 显示TCP传输协议的连线状况。
- -u或—udp 显示UDP传输协议的连线状况。
- -v或—verbose 显示指令执行过程。
- -V或—version 显示版本信息。
- -w或—raw 显示RAW传输协议的连线状况。
- -x或—unix 此参数的效果和指定”-A unix”参数相同。
- —ip或—inet 此参数的效果和指定”-A inet”参数相同。 | 选项 | 功能 | | —- | —- | | -a | 显示所有正在监听(listen) 和未监听的套接字(socket) | | -n | 拒绝显示别名, 能显示数字的全部转化成数字 | | -l | 仅列出在监听的服务状态 | | -p | 表示显示哪个进程在调用 |
3)案例实操
(1)通过进程号查看 sshd 进程的网络信息
➜ ~ netstat -anp | grep sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 727/sshd
tcp 0 80 10.150.22.47:22 120.234.42.66:2152 ESTABLISHED 29395/sshd: root@pt
tcp 0 0 10.150.22.47:22 107.128.210.35:48984 ESTABLISHED 2820/sshd: [accepte
tcp 0 0 10.150.22.47:22 120.234.42.66:2155 ESTABLISHED 32204/sshd: root@no
tcp 0 0 10.150.22.47:22 120.234.42.66:2154 ESTABLISHED 32189/sshd: root@pt
tcp 0 0 10.150.22.47:22 120.234.42.66:2148 ESTABLISHED 11020/sshd: root@pt
tcp 0 0 10.150.22.47:22 120.234.42.66:2153 ESTABLISHED 29402/sshd: root@no
tcp6 0 0 :::22 :::* LISTEN 727/sshd
unix 2 [ ] DGRAM 7941372 32189/sshd: root@pt
unix 2 [ ] DGRAM 7891259 11020/sshd: root@pt
unix 2 [ ] DGRAM 7932120 29395/sshd: root@pt
unix 2 [ ] DGRAM 7941519 32204/sshd: root@no
unix 3 [ ] STREAM CONNECTED 17382 727/sshd
unix 3 [ ] STREAM CONNECTED 7949209 2820/sshd: [accepte
unix 3 [ ] STREAM CONNECTED 7949208 2827/sshd: [net]
Proto:使用的协议 Recv-Q:连接到当前Socket 的用户程序还没有拷贝的字节数 Send-Q:已经发送出去,但是远端的主机还没有确认收到的字节数 Local Address :本地地址:端口 Foreign Address :远程地址:端口
(2)查看某端口号是否被占用
➜ ~ netstat -ntlp | grep 22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 727/sshd
tcp6 0 0 :::22 :::* LISTEN 727/sshd
8.2 crontab 系统定时任务
Linux crontab 是用来定期执行程序的命令。
当安装完成操作系统之后,默认便会启动此任务调度命令。
crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。
注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。
而 linux 任务调度的工作主要分为以下两类:
- 1、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
- 2、个人执行的工作:某个用户定期要做的工作,例如每隔 10 分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置
说明:
crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。
-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。
8.2.1 crontab 服务管理
(1)重新启动 crond 服务
systemctl restart crond
systemctl status crond
systemctl enable --now crond
8.2.2 crontab 定时任务设置
1)基本语法
:::info
crontab [选项]
crontab [ -u user ] file
crontab [ -u user ] { -l | -r | -e }
crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。
-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。
:::
2)选项说明
选项 | 功能 |
---|---|
-e | 编辑 crontab 定时任务 |
-l | 查询 crontab 任务 |
-r | 删除当前用户所有的 crontab 任务 |
3)参数说明
* * * * *
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 6) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
# 分时日月周
crontab -u root -e
(1)进入crontab编辑界面。会打开vim编辑你的工作 :::info
- 执行的任务 ::: | 项目 | 含义 | 范围 | | —- | —- | —- | | 第一个“” | 一小时当中的第几分钟 | 0-59 | | 第二个“” | 一天当中的第几小时 | 0-23 | | 第三个“” | 一个月当中的第几天 | 1-31 | | 第四个“” | 一年当中的第几月 | 1-12 | | 第五个“*” | 一周当中的星期几 | 0-7 ( 0 和 7 都代表星期日) |
(2)特殊符号
特殊符号 | 含义 |
---|---|
* | 代表任何时间。 比如第一个“ *” 就代表一小时中每分钟都执行一次的意思。 |
, | 代表不连续的时间。 比如“ 0 8,12,16 * 命令”, 就代表在每天的 8 点 0 分, 12 点 0 分, 16 点 0 分都执行一次命令 |
- | 代表连续的时间范围。 比如“0 5 1-6 命令”, 代表在周一到周六的凌晨 5 点 0 分执行命令 |
*/n | 代表每隔多久执行一次。 比如“/10 * 命令”, 代表每隔 10 分钟就执行一遍命令 |
(3)特定时间执行命令
时间 | 含义 |
---|---|
45 22 * 命令 | 每天 22 点 45 分执行命令 |
0 17 1 命令 | 每周 1 的 17 点 0 分执行命令 |
0 5 1,15 命令 | 每月 1 号和 15 号的凌晨 5 点 0 分执行命令 |
40 4 1-5 命令 | 每周一到周五的凌晨 4 点 40 分执行命令 |
/10 4 命令 | 每天的凌晨 4 点, 每隔 10 分钟执行一次命令 |
0 0 1,15 * 1 命令 | 每月 1 号和 15 号, 每周 1 的 0 点 0 分都会执行命令。 注意: 星期几和几号最好不要同时出现, 因为他们定义的都是天。 非常容易让管理员混乱 |
4)案例实操
(1)每隔1分钟,向 /root/bailongma.txt 文件中添加一个 11 的数字
➜ ~ crontab -uroot -e
*/1 * * * * /bin/echo "11" >> /root/bailongma.txt
使用者也可以将所有的设定先存放在文件中,用 crontab file 的方式来设定执行时间。
实例
每一分钟执行一次 /bin/ls:
- /bin/ls
在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次 /usr/bin/backup:
0 6-12/3 12 /usr/bin/backup
周一到周五每天下午 5:00 寄一封信给 alex@domain.name:
0 17 1-5 mail -s “hi” alex@domain.name < /tmp/maildata
每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分….执行 echo “haha”:
20 0-23/2 * echo “haha”
下面再看看几个具体的例子:
0 /2 /sbin/service httpd restart 意思是每两个小时重启一次apache 50 7 /sbin/service sshd start 意思是每天7:50开启ssh服务 50 22 /sbin/service sshd stop 意思是每天22:50关闭ssh服务 0 0 1,15 fsck /home 每月1号和15号检查/home 磁盘 1 /home/bruce/backup 每小时的第一分执行 /home/bruce/backup这个文件 00 03 1-5 find /home “.xxx” -mtime +4 -exec rm {} \; 每周一至周五3点钟,在目录/home中,查找文件名为.xxx的文件,并删除4天前的文件。 30 6 /10 * ls 意思是每月的1、11、21、31日是的6:30执行一次ls命令
注意:当程序在你所指定的时间执行后,系统会发一封邮件给当前的用户,显示该程序执行的内容,若是你不希望收到这样的邮件,请在每一行空一格之后加上 > /dev/null 2>&1 即可,如:
20 03 * . /etc/profile;/bin/sh /var/www/runoob/test.sh > /dev/null 2>&1
脚本无法执行问题
如果我们使用 crontab 来定时执行脚本,无法执行,但是如果直接通过命令(如:./test.sh)又可以正常执行,这主要是因为无法读取环境变量的原因。
解决方法:
- 1、所有命令需要写成绝对路径形式,如: /usr/local/bin/docker。
- 2、在 shell 脚本开头使用以下代码:#!/bin/sh . /etc/profile . ~/.bash_profile3、在 /etc/crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得环境变量生效,例如:20 03 * . /etc/profile;/bin/sh /var/www/runoob/test.sh