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)案例实操

  1. # 查看进程的CPU占用率和内存占用率
  2. ~ ps aux

image.png

  1. # 查看进程的父进程ID
  2. ~ ps -ef

image.png
image.png

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)杀死浏览器进程

  1. kill -9 5102

(2)通过进程名称杀死进程

  1. 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

  1. ~ pstree -p

(2)显示进程所属用户

  1. ~ 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)案例实操

  1. ~ top -d 1
  2. ~ top -i
  3. ~ top -p 31568

执行上述命令后,可以按照 P,M,N 对查询出的进程结果进行排序。
image.png :::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 进程的网络信息

  1. ~ netstat -anp | grep sshd
  2. tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 727/sshd
  3. tcp 0 80 10.150.22.47:22 120.234.42.66:2152 ESTABLISHED 29395/sshd: root@pt
  4. tcp 0 0 10.150.22.47:22 107.128.210.35:48984 ESTABLISHED 2820/sshd: [accepte
  5. tcp 0 0 10.150.22.47:22 120.234.42.66:2155 ESTABLISHED 32204/sshd: root@no
  6. tcp 0 0 10.150.22.47:22 120.234.42.66:2154 ESTABLISHED 32189/sshd: root@pt
  7. tcp 0 0 10.150.22.47:22 120.234.42.66:2148 ESTABLISHED 11020/sshd: root@pt
  8. tcp 0 0 10.150.22.47:22 120.234.42.66:2153 ESTABLISHED 29402/sshd: root@no
  9. tcp6 0 0 :::22 :::* LISTEN 727/sshd
  10. unix 2 [ ] DGRAM 7941372 32189/sshd: root@pt
  11. unix 2 [ ] DGRAM 7891259 11020/sshd: root@pt
  12. unix 2 [ ] DGRAM 7932120 29395/sshd: root@pt
  13. unix 2 [ ] DGRAM 7941519 32204/sshd: root@no
  14. unix 3 [ ] STREAM CONNECTED 17382 727/sshd
  15. unix 3 [ ] STREAM CONNECTED 7949209 2820/sshd: [accepte
  16. unix 3 [ ] STREAM CONNECTED 7949208 2827/sshd: [net]

image.png

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