12.进程管理和计划任务教程
1 进程介绍
1.1 进程概念
Process: 运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位
1.2 系统进程状态
Linux系统进程的状态:
- 运行态:running
- 就绪态:ready
- 睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable
- 停止态:stopped,暂停于内存,但不会被调度,除非手动启动
- 僵尸态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死 态 的子进程
1.3 进程优先级
普通进程的静态优先级:
- nice值::-20到19,对应系统优先级100-139或99
实时优先级(动态优先级):
- 99-0 值最大优先级最高
2 进程管理工具
2.1 pstree
查看进程树
格式:
pstree [OPTION] [ PID | USER ]
常用选项:
- -p 显示PID
- -T不显示线程数量,默认显示线程
范例:
[root@centos8 ~]$pstree -p user
bash(446775)───ping(446800)
2.2 ps
ps 即process state,可以进程当前状态的快照,默认显示当前终端中的进程,Linux系统各进程的相关 信息均保存在/proc/PID目录下的各文件中
格式:
ps [options]
常用选项:
BSD风格选项
- a 选项包括所有终端(tty)中的进程
- x 所有无终端(tty)的进程
- u 显示进程所有者的信息
- f 显示进程树
- k|--sort 对属性排序,属性前加 - 表示倒序
- o 属性... 选项显示定制的属性信息:pid、cmd、%cpu
UNIX风格选项
- -e 显示所有进程
- -f 显示完整格式程序信息
- -u 指定有效的用户ID或名称
GUN
- --help 查看帮助
- --sort 对属性排序相当于BSD k选项
ps输出属性
[root@centos8 ~]$ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 22 0.0 0.0 0 0 ? SN 2020 0:00 [ksmd]
[root@centos8 ~]$ps -ef
UID PID PPID C STIME TTY TIME CMD
root 10 2 0 2020 ? 00:02:42 [rcu_sched]
C : ps -ef 显示列 C 表示cpu利用率
VSZ: Virtual memory SiZe,虚拟内存集,线性内存
RSS: ReSident Size, 常驻内存集,即真正占用的内存
STAT: 进程状态
R:running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前台进程
l: 多线程进程
L:内存分页并带锁
N:低优先级进程
<: 高优先级进程
s: session leader,会话(子进程)发起者
I:Idle kernel thread,CentOS 8 新特性
ni: nice值
pri: priority 优先级
rtprio: 实时优先级
psr: processor CPU编号
常用组合:
aux 相比-ef该选项显示cpu%值更详细
-ef
-eFH
范例:
[root@centos8 ~]$ps auxf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S 2020 0:01 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 2020 0:00 \_ [rcu_gp]
按CPU利用率倒序排序centons6以下版本不支持
[root@centos8 ~]$ps axo pid,cmd,%cpu,%mem k -%cpu
PID CMD %CPU %MEM
334445 /usr/local/aegis/aegis_clie 0.5 3.1
1 /usr/lib/systemd/systemd -- 0.0 0.6
2 [kthreadd] 0.0 0.0
3 [rcu_gp] 0.0 0.0
范例:实现进程和CPU的绑定
[root@centos8 ~]#taskset --help
Usage: taskset [options] [mask | cpu-list] [pid|cmd [args...]]
2.3 prtstat
显示详细的进程信息
格式:
prtstat [options] PID ...
选项:
-r raw格式显示
[root@centos8 ~]$prtstat -r 446775
pid: 446775 comm: bash
state: S ppid: 446774
pgrp: 446775 session: 446742
tty_nr: 34817 tpgid: 446852
flags: 400100 minflt: 1320
cminflt: 2894 majflt: 0
cmajflt: 0 utime: 1
stime: 0 cutime: 0
cstime: 15 priority: 20
nice: 0 num_threads: 1
itrealvalue: 0 starttime: 1017091513
vsize: 24870912 rss: 1245
rsslim: 18446744073709551615 startcode: 94494540193792
endcode: 94494541273016 startstack: 140731806454160
kstkesp: 0 kstkeip: 0
wchan: 0 nswap: 0
cnswap: 0 exit_signal: 17
processor: 0 rt_priority: 0
policy: 0 delayaccr_blkio_ticks: 0
guest_time: 0 cguest_time: 0
2.4 nice和renice
nice
以指定的优先级来启动进程
格式:
nice [OPTION] [COMMAND [ARG]...]
选项:
- -n 指定优先级值,默认值为10
renice
调整正在执行进程的优先级
格式:
renice [-n] priority pid...
范例:
[root@centos8 ~]$nice -n -20 ping 127.1.1.1
[root@centos8 ~]$ps axo pid,cmd,nice | grep ping | grep -v grep
447048 ping 127.1.1.1 -20
2.5 pgrep
按照条件搜索进程,也可以使用ps 选项 | grep 'pattern'搜索
pidof可以根据程序名称查看进程pid
格式:
pgrep [options] pattern
常用选项:
- -u uid:生效者
- -U uid:进程发起者
- -p pid 显示指定进程的子进程
范例:
[root@centos8 ~]$pgrep -au user
447081 -bash
447115 bc
pidof查看pid
[root@centos8 ~]#pidof bash
19035 18813 18789 1251
[root@centos8 ~]#pidof ping.sh
[root@centos8 ~]#pidof -x ping.sh
19035
2.6 uptime
显示以下内容
- 当前系统时间
- 系统已经启动时间
- 系统在线用户数量
- 系统1分钟、5分钟和15分钟平均负载,建议超过5时告警
范例:
[root@centos8 ~]$uptime
18:04:35 up 117 days, 18:50, 3 users, load average: 0.00, 0.00, 0.00
[root@centos8 ~]$w
18:04:45 up 117 days, 18:51, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 49.118.73.132 16:26 0.00s 0.10s 0.00s w
root pts/1 49.118.73.132 16:28 12:05 0.02s 0.02s -bash
root pts/2 49.118.73.132 17:05 4:37 0.03s 0.00s bc
2.7 top
查看实时的进程状态
h或?可以查看帮助,q或esc退出帮助
- 排序
P:以占据的CPU百分比,%CPU
M:以占据内存的百分比,%MEM
T:累计占据CPU时长,TIME+
- 首部信息显示
uptime信息:l
tasks及cpu信息:t
cpu分别显示:1
memory信息:m
- 终止指定进程:k
- 保存文件:W
选项:
- -d # 指定刷新的时间间隔,默认为3秒
- -n # 刷新多少次以后退出
2.8 free
显示内存空间使用状态
格式:
free [OPTION]
常用选项:
- -b 以字节为单位
- -m 以MB为单位
- -g 以GB为单位
2.9 pmap
查看进程对应内存映射
格式:
pmap [options] pid [...]
cat /proc/PID/maps
范例:
#查看系统调用
[root@centos8 ~]$strace ls
execve("/usr/bin/ls", ["ls"], 0x7ffec1f150f0 /* 24 vars */) = 0
brk(NULL) = 0x55607ac10000
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffd1a4a9aa0) = -1 EINVAL (Invalid argument)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=31690, ...}) = 0
mmap(NULL, 31690, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f96cc1c5000
close(3) = 0
openat(AT_FDCWD, "/lib64/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240z\0\0\0\0\0\0"..., 832) = 832
lseek(3, 157536, SEEK_SET) = 157536
read(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0", 32) = 32
fstat(3, {st_mode=S_IFREG|0755, st_size=304848, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f96cc1c3000
lseek(3, 157536, SEEK_SET) = 157536
read(3,
2.10 虚拟内存信息vmstat
格式:
vmstat [options] [delay [count]]
显示说明:
procs:
r:可运行(正运行或等待运行)进程的个数,和核心数有关
b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)
memory:
swpd: 交换内存的使用总量
free:空闲物理内存总量
buffer:用于buffer的内存总量
cache:用于cache的内存总量
swap:
si:从磁盘交换进内存的数据速率(kb/s)
so:从内存交换至磁盘的数据速率(kb/s)
io:
bi:从块设备读入数据到系统的速率(kb/s)
bo: 保存数据至块设备的速率
system:
in: interrupts 中断速率,包括时钟
cs: context switch 进程切换速率
cpu:
us:Time spent running non-kernel code
sy: Time spent running kernel code
id: Time spent idle. Linux 2.5.41前,包括IO-wait time.
wa: Time spent waiting for IO. 2.5.41前,包括in idle.
st: Time stolen from a virtual machine. 2.6.11前, unknown.
2.12 统计CPU和设备IO信息iostat
范例:
[root@centos8 ~]$iostat
Linux 4.18.0-193.14.2.el8_2.x86_64 (centos8.2) 03/14/2021 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.44 0.02 0.47 0.01 0.00 99.07
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.28 0.06 3.04 618723 31981155
2.13 系统资源统计 dstat
dstat由pcp-system-tools包提供,用于代替 vmstat,iostat功能
格式:
dstat [-afv] [options..] [delay [count]]
常见选项:
- -c 显示cpu相关信息
- -d 显示disk相关信息
- -m 显示memory相关统计数据
2.14 监视磁盘I/O iotop
格式:
iotop [OPTIONS]
常见选项:
- -d SEC, --delay=SEC设置每次监测的间隔,默认1秒,接受非整形数据例如1.1
- -u USER, --user=USER指定监测某个用户产生的I/O
- -P, --processes仅显示进程,默认iotop显示所有线程
交互按键
left和right方向键:改变排序
r:反向排序
o:切换至选项--only
p:切换至--processes选项
a:切换至--accumulated选项
q:退出
i:改变线程的优先级
2.15 显示网络带宽使用情况iftop
通过EPEL源安装
2.16 查看网络实时吞吐量nload
nload 是一个实时监控网络流量和带宽使用情况,以数值和动态图展示进出的流量情况,通过EPEL源安装
界面操作 上下方向键、左右方向键、enter键或者tab键都就可以切换查看多个网卡的流量情况
按 F2 显示选项窗口
按 q 或者 Ctrl+C 退出 nload
2.17 查看进程打开文件 lsof
查看当前系统文件的工具
格式:
lsof [options] [args]
常见选项:
- -a:列出打开文件存在的进程
- -c<进程名>:列出指定进程所打开的文件
- -g:列出GID号进程详情
- -d<文件号>:列出占用该文件号的进程
- +d<目录>:列出目录下被打开的文件
- -p<进程号>:列出指定进程号所打开的文件
- -u:列出UID号进程详情
- -i<条件>:列出符合条件的进程(4、6、协议、:端口、 @ip )
范例:
[root@centos8 ~]$lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 976 root 5u IPv4 24095 0t0 TCP *:ssh (LISTEN)
[root@centos8 ~]$lsof -c bc
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bc 456068 user cwd DIR 253,1 83 100723329 /home/user
bc 456068 user rtd DIR 253,1 287 128 /
bc 456068 user txt REG 253,1 97256 34099041 /usr/bin/bc
bc 456068 user mem REG 253,1 36824 50333368 /usr/lib64/libdl-2.28.so
bc 456068 user mem REG 253,1 4176104 50333366 /usr/lib64/libc-2.28.so
bc 456068 user mem REG 253,1 208616 50333269 /usr/lib64/libtinfo.so.6.1
bc 456068 user mem REG 253,1 216912 50333259 /usr/lib64/libncurses.so.6.1
bc 456068 user mem REG 253,1 338648 50333641 /usr/lib64/libreadline.so.7.0
bc 456068 user mem REG 253,1 302552 50333359 /usr/lib64/ld-2.28.so
bc 456068 user mem REG 253,1 337024 16780403 /usr/lib/locale/en_US.utf8/LC_CTYPE
bc 456068 user mem REG 253,1 26998 16780842 /usr/lib64/gconv/gconv-modules.cache
bc 456068 user 0u CHR 136,1 0t0 4 /dev/pts/1
bc 456068 user 1u CHR 136,1 0t0 4 /dev/pts/1
bc 456068 user 2u CHR 136,1 0t0 4 /dev/pts/1
#使用lsof恢复使用中误删除的文件
lsof |grep /var/log/messages
rm -f /var/log/messages
lsof |grep /var/log/messages
cat /proc/653/fd/6
cat /proc/653/fd/6 > /var/log/messages
2.18 信号发送 kill
格式:
kill [-signal|-s signal|-p] [-q value] [-a] [--] pid|name
常用选项:
- -SIGNAL
- -u uid: effective user,生效者
- -U uid: real user,真正发起运行命令者
- -t terminal: 与指定终端相关的进程
- -P pid: 显示指定进程的子进程
常用信号:
- 1)SIGHUP 无须关闭进程而让其重读配置文件
- 2)SIGINT 中止正在运行的进程;相当于Ctrl+c
- 3)SIGQUIT 相当于ctrl+\
- 9)SIGKILL 强制杀死正在运行的进程
- SIGTERM 终止正在运行的进程,默认信号
- SIGCONT 继续运行
- SIGSTOP 后台休眠
指定信号的方法 :
- 信号的数字标识:1, 2, 9
- 信号的简写名称:HUP,hup
- 信号完整名称:SIGHUP,sighup
范例:
#利用 0 信号实现进程的健康性检查
[root@centos8 ~]#man kill
If signal is 0, then no actual signal is sent, but error checking is still
performed.
[root@centos8 ~]#killall -0 ping
[root@centos8 ~]#echo $?
0
#此方式有局限性,即使进程处于停止或僵尸状态,此方式仍然认为是进程是健康的
2.19 作业管理
Linux的作业控制
- 前台作业:通过终端启动,且启动后一直占据终端
- 后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台 后,剥离与终端的关系可以采用如下方式:
- nohup COMMAND &>/dev/null &
- screen;COMMAND
- tmux;COMMAND
使用jobs命令可以查看当前终端
所有作业
2.20 并行执行任务
利用后台执行,可以实现多个进程同时执行功能,从而提高执行效率,下面介绍3中方法。
方法一:
#在多个脚本后添加&符号实现并行执行多个脚本
[root@centos8 ~]$cat all.sh
f1.sh&
f2.sh&
f3.sh&
方法二:
(f1.sh&);(f2.sh&);(f3.sh&)
方法三:
f1.sh&f2.sh&f3.sh&
范例:
#利用&实现同时ping多个地址
[root@centos8 ~]$ping 127.1.1.1&ping 127.1.1.2
[1] 456646
PING 127.1.1.2 (127.1.1.2) 56(84) bytes of data.
64 bytes from 127.1.1.2: icmp_seq=1 ttl=64 time=0.020 ms
PING 127.1.1.1 (127.1.1.1) 56(84) bytes of data.
注意:由于使用&会使得进程进入后台运行,所以ctrl+c不能停止上例中进程,可以使用killall ping
才可以结束
3 任务计划
任务计划就是让系统自动的按照时间或周期性执行任务,计划任务又分为一次性任务和周期性任务。
3.1 一次性任务
at:用于设定未来某个时间只执行一次的任务
格式:
at [option] TIME
Files:
/var/spool/at #at队列存放位置
/etc/at.allow #白名单:默认不存在,只有该文件中的用户才能执行at命令
/etc/at.deny #黑名单:y 默认存在,拒绝该文件中用户执行at命令
notes:
执行任务时PATH变量的值和当前定义任务的用户身份一致
atd服务启动时才能实现at任务
若/etc/at.deny,/etc/at.allow文件都不存在,只有 root 可以执行 at 命令allow优先级高于deny,当两个文 件中都有同一个用户时,allow文件生效
常见选项:
- -l 列出指定队列中等待运行的作业;相当于atq
- -d 删除指定的作业;相当于atrm
- -c 查看具体作业任务
- -f /path/file 指定的文件中读取任务
- -m 当任务被完成之后,将给用户发送邮件,即使没有标准输出
时间格式:
HH:MM 在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务
02:00
HH:MM YYYY-MM-DD 规定在某年某月的某一天的特殊时刻进行该项任务
02:00 2016-09-20
HH:MM[am|pm] + number [minutes|hours|days|weeks], 在某个时间点再加几个时间后才进行该
项任务
now + 5 min
02pm + 3 days
执行方式:
- 默认交互式执行
- 也可以配合管道符进行输入重定向
- -f 选项支持从文件读取
3.2 周期性任务计划 cron
cron任务分为
- 系统维护作业,/etc/crontab 主配置文件, /etc/cron.d/ 子配置文件
- 用户cron任务:保存在 /var/spool/cron/USERNAME,利用 crontab 命令管理
cron的日志位于:/var/log/cron
注意:cron 依赖于crond服务,确保crond守护处于运行状态
3.2.1 系统cron计划任务
通过编辑/etc/crontab来制定系统计划任务
[root@centos8 ~]$cat /etc/crontab
SHELL=/bin/bash #shell类型
PATH=/sbin:/bin:/usr/sbin:/usr/bin #若任务使用相对路径环境变量内的任务才能找到并被执行
MAILTO=root #发送邮件用户
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
时间指定方式说明:
* 给定时间点上有效取值范围内的所有值
#,#,# 离散时间值
#-# 连续时间取值
/# 在指定时间范围上,定义步长
example:
#每晚21:10分使用user用户输出"Howdy!"
10 21 * * * user /bin/echo "Howdy!"
##每3小时echo和wall命令
0 */3 * * * user /bin/echo “howdy”; wall “welcome!”
3.2.2 用户计划任务
格式:
crontab [-u user] file
Files:
/var/spool/cron/ #用户专用的cron任务文件
/etc/cron.allow #白名单作用于at类似
/etc/cron.deny #黑名单作用于at类似
notes:
crond是crontab的守护进程,执行crontab前请确保crond处于运行状态
默认标准输出和错误会被发邮件给对应的用户,如:user创建的任务就发送至user的邮箱
用户的cron 中默认 PATH=/usr/bin:/bin,如果使用其它路径,在任务文件的第一行加PATH=/path
常见选项:
- -l 列出所有任务
- -e 编辑任务
- -r 移除所有任务
- -i 同-r一同使用,以交互式模式移除指定任务
- -u user 仅root可运行,指定用户管理cron任务
注意:运行结果的标准输出和错误以邮件通知给相关用户
cron任务中不建议使用%,它有特殊用途,它表示换行的特殊意义,且第一个%后的所有字符串会被将 成 当作命令的标准输入
范例:时间之间关系
[root@centos8 ~]#man 5 crontab
Note: The day of a command's execution can be specified in the following two
fields — 'day of month', and 'day of week'. If both fields are restricted
(i.e., do not contain the "*" character), the command will be run when either
field matches the current time.
example:
30 4 1,15 * 5 user /bin/echo "Howdy!"
#上面在每月1-15日和每周五都会执行
范例:让系统默认使用vim打开编辑任务文件
[root@centos8 ~]$ cat /etc/profile.d/env.sh
export EDITOR=vim
思考:如果计划任务期间关机了,开机后任务还会执行么?
anacron
若计划任务期间系统处于关机状态,会 anacron来确保开机后自动执行未执行的计划任务由/etc/cron.hourly/0anacron执行,当执行任务时,更新/var/spool/anacron/cron.daily 文件的时间戳
配置文件:/etc/anacrontab 负责执行/etc/ cron.daily /etc/cron.weekly /etc/cron.monthly中系统任务
使用man 5 anacrontab
查看/etc/anacrontab详细说明
3.2.3 sleep
延迟命令执行时间,以秒为单位,可以实现在秒级别运行任务
格式:
sleep NUMBER[SUFFIX]
SUFFIX:
s: 秒, 默认
m: 分
h: 小时
d: 天
3.2.4 管理临时文件
CentOS 7 使用 systemd-tmpfiles-setup服务实现
CentOS 6 使用/etc/cron.daily/tmpwatch定时清除临时文件
配置文件
/etc/tmpfiles.d/*.conf
/run/tmpfiles.d/*.conf
/usr/lib/tmpfiles/*.conf
3.2.5 练习
1.显示统计占用系统内存最多的进程,并排序
[root@centos8 ~]$ps axo pid,cmd,%cpu,%mem,rss --sort -rss
PID CMD %CPU %MEM RSS
334445 /usr/local/aegis/aegis_clie 0.5 3.1 58980
556 /usr/lib/systemd/systemd-jo 0.0 2.4 44936
808 /usr/libexec/sssd/sssd_nss 0.0 2.0 38296
880 /usr/libexec/platform-pytho 0.0 1.5 28588
718 /usr/lib/polkit-1/polkitd - 0.0 1.2 23116
2.编写脚本,使用for和while分别实现192.168.0.0/24网段内,地址是否能够ping通,若ping通则输出"sucess!",若ping不通则输出"fail!"
#for循环实现方式
[root@centos8 script]$cat for_ping.sh
#!/bin/bash
for ip in {1..254};do
{
ping -c1 192.168.0.$ip > /dev/nvll && echo 192.168.0.$ip connect sucess! || echo 192.168.0.$ip connect fail!
}&
done
wait
#while循环实现方式
[root@centos8 script]$cat while_ping.sh
#!/bin/bash
i=1
while [ $i -lt 255 ];do
( ping -c1 192.168.0.$i > /dev/null && echo 192.168.0.$i connect sucess! || echo 192.168.0.$i connect fail! )&
i=$[i+1]
done
3.每周工作日1:30,将/etc备份至/backup目录中,保存文件名称格式为“etcbak-yyyy-mm-dd-HH.tar.xz”,其中日期是前一天的时间
[root@centos8 script]$cat backup.sh
#!/bin/bash
tar -jcf /backup/"etcbak-`date -d '-1day' +%F-%H`.tar.xz" /etc/
[root@centos8 data]$crontab -l
30 1 * * 1-5 /data/script/backup.sh
4.工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高于80%,就发送邮件报警
[root@centos8 data]$crontab -l
/10 * * * 1-5 /data/script/check_disk
[root@centos8 ~]$cat /data/script/check_disk.sh
#!/bin/bash
threshold=5
df -h | sed -rn '/^\/dev\//s#^([^ ]+).*([0-9]+)%.*#\1 \2#p' | while read Device Use;do
[ $Use -gt $threshold ] && echo "$Device will be full,USE:$Use" | mail -s diskfull root
done