文章目录
- 例行工作安排
- 单一工作安排
- 循环执行的任务
- 注意事项
- 唤醒停机期间的任务
- 进程任务处理
- 任务管理`job control`
- 后台执行
- 进程管理
- 进程的执行顺序
- 系统资源查看
- 特殊文件与进程
- 最后
例行工作安排
类似于定时任务、系统安排的任务提醒等
一般在任务中,有两个类型:
- 例行性:每个一定的周期就需要执行的事项
crontab
指令 处理循环执行的指令 - 突发性:做完以后就没有了
at
指令 处理仅执行一次就结束的指令
单一工作安排
要使用单一工作安排,就需要Linux系统上面必须有负责这个安排的服务,即atd
服务:
下面是我本机的 atd
服务情况:
如果不是这个状态,就使用下面的命令处理:
#重新启动atd服务
systemctl restart atd
# 服务开机自启
systemctl enable atd
# 查看atd目前状态
systemctl status atd
有了该服务的支持,就可以实现 单次的工作安排at
命令了:at
指令产生需要运行的工作,并将这个工作以文本文件的形式写入/var/spool/at/
目录内,该工作便能等待atd
这个服务的取用与执行了
处于安全考虑,由 /etc/at.allow
和 /etc/at.denv
这两个文件来限制at
的使用,在这两个文件的限制下,at
的执行流程如下:
即 /etc/at.allow
文件的管理较为严格,/etc/at.deny
较为松散
一般系统都是保留空的/etc/at.deny
文件,即允许所有人使用at
指令。
at [-mldv] TIME
at -c 工作号码
-m 当at工作完成后,即使没有输出信息,也以 email通知使用者,该工作已经完成
-l 相当于atq,列出目前系统上所有该用户的at安排
-d 相当于atrm,可以取消一个在at中的安排
-v 可以使用较为明显的时间格式列出任务列表
-c 可以列出后面接的该选项工作的实际指令内容
TIME: 时间格式, 这里可以定义出『什么时候要进行 at 这项工作』的时间,格式有:
HH:MM ex> 04:00
在今日的 HH:MM 时刻进行,若该时刻已超过, 则明天的 HH:MM 进行此工作。
HH:MM YYYY-MM-DD ex> 04:00 2015-07-30
强制规定在某年某月的某一天的特殊时刻进行该工作!
HH:MM[am|pm] [Month] [Date] ex> 04pm July 30
也是一样, 强制在某年某月某日的某时刻进行!
HH:MM[am|pm] + number [minutes|hours|days|weeks]
ex> now + 5 minutes ex> 04pm + 3 days
就是说,在某个时间点『再加几个时间后』才进行。
此外,使用at安排的工作,系统会将该选项at工作独立出bash环境,直接交给系统的atd
程序接管,因此当下达了at
的工作之后就可以立即脱机了,剩下的工作就完全交给Linux管理即可。
如果输入了错误的指令,可以通过atq
查看安排,并通过 atrm
进行移除
# 查看项目安排
atq
# 移除项目
atrm (jobnumber)
循环执行的任务
与at
执行的任务限制类似,也需要下面两个文件限制使用者账号:
当用户使用功能contab
建立工作安排后,该项工作就被记录到/var/spool/cron
中了,并且是以 账号 来作为判别的依据。
所以如果怀疑 系统中被植入了木马,就可以考虑查看
var/log/cron
这个文件中是否有木马程序在执行
crontab [-u username] [-ll-el-r]
-u 只有root用户才可以执行这个任务,即帮助其他使用者建立/移除 crontab 工作安排
-e 编辑 crotab的工作内容
-l 查询crontab的工作内容
-r 移除所有的crontab 的工作内容,如果要仅仅移除一项,就可以使用-e去编辑
每项工作都有六个字段,这六个字段的含义如下:
如果是系统的例行性人物,可以直接编辑/etc/crontab
文件实现 设置定时任务,只要编辑完该文件,将这个修改保存,cron
的设定就会自动执行(如果没有马上执行,那么就需要重新启动crond
服务:systemctl restart crond
)
crond
服务读取配置文件的位置
一般是从如下三个地方读取配置文件:
/etc/crontab
/etc/cron.d/*
/var/spool/cron/*
如果需要自己开发新的软件,该软件要拥有自己的crontab
定时指令时,就可以将 配置文件放置到 /etc/cron.d
目录下
注意事项
在使用 上面的命令安排 例行操作时,要注意以下几点:
- 避免资源分配不均
- 取消不必要的输出
可以将错误信息重定向到/dev/null
中 - 安全检验
- 周 和 日月 不可共存
唤醒停机期间的任务
anacron
命令可以实现 在指定时间该执行却没有执行的任务(意外断电而无法执行的任务)
anacron
命令也是每个小时被crond
执行一次,然后ancron
再去检测相关的 任务有没有被执行,如果 有超过期限的工作,就执行该 安排任务,执行完毕或无需执行任何任务时,anacron
就停止了
anacron
其实是一支程序并非一个服务!这支程序在 CentOS 当中已经进入 crontab 的排程喔!同时anacron
会每个小时被主动执行一次
进程任务处理
第16章
任务管理job control
后台执行
如果只有一个bash环境,又想要同时进行多个工作,可以将某些工作直接放到后台执行,就是在命令的后面加上一个&
这样在后台执行的命令就不怕被ctrl+C
打断了
# 在编辑test.txt 文件时,使用Ctrl+Z 将当前任务挂到后台
[root@AliComputer shLearn]# vim test.txt
[1]+ Stopped vim test.txt
[root@AliComputer shLearn]# jobs -l
# 现实正在挂载在后台的程序
[1]+ 3654019 Stopped vim test.txt
[root@AliComputer shLearn]#
但是,这里要注意一点,&
的作用是将任务放到后台执行,表示放入这个终端的后台,如果 该终端退出了,那么该任务也就被强制终止了,如果要实现 退出终端,任务继续执行,就需要使用nohup
命令了,它可以实现让命令在 该用户脱机或注销系统后继续执行该命令
# 在终端 前台执行
nohup [指令与参数]
# 在终端 后台执行
nohup [指令与参数] &
除此之外,我们还可以将当前的工作暂停:比如当前正在使用vim
编辑文件,如果要使用shell, 可以使用ctrl+Z
实现暂时换出vim,回到shell环境。
如果要查看有多少个工作在后台,可以通过如下命令实现:
jobs [-lrs]
-l 列出job number 与指令串之外,同时列出PID的号码
-r 仅列出正在背景运行的任务
-s 仅列出正在背景中暂停的工作
在查找到在后台的工作后,就可以通过如下的命令实现将 后台的工作放到前台继续处理:
fg %jobNumber
%jobnumber jobNumber 为工作号码,这里的% 必须要有
使用如下:
# 列出后台任务
[root@AliComputer shLearn]# jobs -l
[1]+ 3654019 Stopped vim test.txt
# 回到该任务,继续执行 1
[root@AliComputer shLearn]# fg %1
vim test.txt
[root@AliComputer shLearn]# jobs -l
[root@AliComputer shLearn]#
下面考考虑该如何管理后台的工作:kill
kill -signal %jobnumber
-l 列出目前kill可以使用的信号有哪些
signal 表示后面那个任务的 操作指示(在Linux开发 的信号中有详细讲解)
-1 重新读取一次参数的配置文件,类似reload
-2 由键盘输入 ctrl-C同样的动作
-9 立刻强制删除一个工作
-15 以正常的进程方式终止一个工作,与-9不一样
使用如下:
-9
是用在 强制删除一个不正常的工作时使用的,-15
是用在以正常步骤结束一个工作(kill
命令的默认值也是15)
进程管理
这里主要讲解 观察进程、管理基础相关的命令,并不涉及相关操作系统 API 等原理和操作使用。
ps
:获取当前进程运行情况(这里仅列举常用的命令)
# 获取系统所有的进程参数
ps aux
# 观察所有系统数据
ps -lA
# 进查看自己的bash 相关进程
ps -l
# 查看进程树状态
ps axjf
-A 所有的process 均显示出来,与-e 效果相似
-a 不予terminal有关的进程
-u 有效使用者的进程
x 通常与a这个参数一起使用,可以列出完整信息
下面的选项是限制输出格式的
l 较长,较详细的列出PID信息
j 工作格式 jobs format
-f 更加完整的输出
列出的主要字段如下:
- F :进程标志(process flags), 表明 该进程的总结权限
- 4 :表示该进程的权限为root
- 1 :表示该子进程仅进行 复制
fork
却没有执行
- S :表示进程状态
- R : running,该进程在运行中
- S : Sleep,该进程在睡眠中,可以被唤醒
- D : 不可被唤醒的睡眠状态,一般是在等待 I/O 的状态
- T : 停止状态,可能是在工作控制或 除错 的状态
- Z : 僵尸进程,进程已经终止,但是无法被移除置内存外
- UID/PID/PPID : 该进程的所有者/进程PID号码/进程父进程PID号码
- C : CPU使用率
- PRI/NI : P r i o r i t y / N i c e Priority/Nice Priority/Nice的缩写,表示此进程被CPU所执行的优先级,数值越小表示该进程越快被CPU执行
- ADDR/SZ/WCHAN : 与内存有关,ADDR表示该进程在内存的哪个部分,running 的进程就显示
-
, /SZ 表示此进程使用的内存,/WCHAN 表示该进程使用功能在运行中,若在运行中,使用-
表示 - TTY: 登入者的中断位置,若为 远程登录 则使用动态终端接口
pts/n
- TIME : 调用CPU时间,即此进程实际花费的 CPU运行时间
- CMD : command的缩写,创建此进程的指令
使用ps aux
展示的字段与上面的命令稍有不同,但区别不大:
上面的ps
命令是静态观察进程执行情况,下面的top
就是动态的观察,可持续侦测进程的运行状况
top [-d 数字] | top [-bnp]
-d 后面可以接秒数,表示top命令更新的频率
-b 以批次的方式执行top,通常搭配数据重定向将结果输出到文件中
-n 与-b搭配,表示需要进行几次top的结果输出
-p 指定某个PID进行观察监测
在top执行过程中,可以使用如下的 按键指令
? 显示在top中 可用的按键指令
P 以CPU 使用资源排序
M 以内存使用资源排序
N 以PID排序
T 由该程序使用的CPU时间累积值排序
k 给于某个PID一个信号
r 给予某个PID一个新的nice值
q 离开top程序
其中第一行显示的信息如下:
第二行(Tasks…)表示:目前这个进程的总量与个别进程 处于什么状态
第三行(%Cpus…)表示:显示CPU的整体负载,每个项目可使用?
来查阅,特别注意wa
项目,表示 I/O wait,一眼系统变慢就是由于 I/O 产生的问题比较大
第四行与第五行表示:目前的物理内存与虚拟内存的使用情况,swap
要尽可能的小,如果swap很大,就表示系统的物理内存不足
第六行:当前在 top 程序中 输入指令时,限制转态的地方
下面就是 每个进程的详细信息了:
top 预设使用CPU使用率排序
pstree
可以表示进程之间的相关性
pstree [-A|U] [-up]
-A 各进程树之间的连接以ASCII字符连接,最常用
-U 各进程树之间的连接以 万国码 连接,但是在某些终端下可能会有错误
-P 列出每个process的PID
-u 同时列出每个process的所属账号关系
进程管理最常用的就是使用信号实现,常用的信号如下:kill -signal PID
killall
指令可以实现发出SIGHUP
信号,终止整个服务,不仅仅是终止一个进程那么简单了
killall [-iIe] [command name]
-i 交互式操作
-e exact,表示后面接的 command name要一致,但整个完整的指令不能超过15个字符
-l 指令名称,忽略大小写
进程的执行顺序
CPU 安排进程的执行是有一定的规则的,Linux赋予每个进程一个 优先执行序(priority,PRI),这个PRI值越低,表示优先级越高,这个值由Linux核心动态调整,用户无法直接调整,但是如果想要 执行进程的执行顺序,可以通过 Nice(Ni) 值进行调整, 有
P
R
I
(
n
e
w
)
=
P
R
I
(
o
l
d
)
+
n
i
c
e
PRI(new)=PRI(old)+nice
PRI(new)=PRI(old)+nice , 虽然 nice值可以影响 PRI,但是最终的 PRI仍然要经过系统分析后决定,而且 为了方便调整 Nice值是有正负的,当nice值为负时,就表示要降低该进程的 PRI值,优先处理该进程,有如下注意点:
一般的调整方式如下:
-
一开始执行程序就立即给予一个特定的nice值:
nice
nice [-n 数字] command -n 后面接一个数字,数字范围在 -20~19
一般在执行有些不重要的进程时,就可以调大nice值,比如备份系统资源这样的工作
-
调整某个已经存在的 PID 的nice值:
renice
renice [number] PID PID 某个进程的ID(从 ps命令或其他进程观察程序中获取)
系统资源查看
free
: 查看内存使用情况
free [-b|-k|-m|-g|-h] [-t] [-s N -c N]
-b 直接输出free时,显示的单位是 Kbytes,可使用 b,M,KB,G来显示,也可以让系统指定单位(-h)
-t 在输出的最终结果,显示物理内存与swap的总量
-s 可以让系统每几秒输出一次
-c 与-s异瞳处理,让free列出几次的意思
使用如下:
一般Swap
最好不要被使用,最好不要超过
20
20%
20以上,超过了则说明物理内存不足了
uname
: 查看系统与核心相关的信息
uname [-asrmpi]
-a 所有系统相关的信息,包括低下的数据都会被列出
-s 系统核心名称
-r 核心版本
-m 本系统的硬件名称
-p CPU类型,与-m类型
-i 硬件平台
使用如下:
uptime
: 观察系统启动时间与工作负载,就是top
命令最上面的哪一行
netstat
: 追踪网络或socket文件:
netstat -[atunlp]
-a 将目前系统上面所以的联机、监听、socket数据都列出
-t 列出tcp网络封包的数据
-u 列出udp网络封包的数据
-n 不以服务的服务名称,以 端口号(port number) 来显示
-l 列出目前正在网络监听(listen)的服务
-p 列出该网络的服务进程PID
当前的udp服务如下:
各个字段的含义如下:
当前主机启动的服务:
dmesg
: 分析核心产生的信息,比如系统开机时,系统会检测 系统的硬件,检测到的信息就在这里
vmstat
: 检测系统资源变化
[root@study ~]# vmstat [-a] [延迟 [总计侦测次数]] <==CPU/内存等信息
[root@study ~]# vmstat [-fs] <==内存相关
[root@study ~]# vmstat [-S 单位] <==设定显示数据的单位
[root@study ~]# vmstat [-d] <==与磁盘有关
[root@study ~]# vmstat [-p 分区槽] <==与磁盘有关
选项与参数:
-a :使用 inactive/active(活跃与否) 取代 buffer/cache 的内存输出信息;
-f : 开机到目前为止,系统复制 (fork) 的进程数;
-s : 将一些事件 (开机至目前为止) 导致的内存变化情况列表说明;
-S :后面可以接单位, 让显示的数据有单位。例如 K/M 取代 bytes 的容量;
-d :列出磁盘的读写总量统计表
-p :后面列出分区槽,可显示该分区槽的读写总量统计表
使用如下:
各个字段的含义如下:
查看系统所有磁盘的读写状态:
一般如果 I/O 部分特别忙碌,系统就会变的非常慢
特殊文件与进程
进程都是在内存当中!而内存当中的数据又都是写入到 /proc/*
这个目录下的,基本上,目前主机上面的各个进程的 PID 都是以目录的型态存在于 /proc
当中。 举例来说,我们开机所执行的第一支程序 systemd
他的 PID 是 1 , 这个 PID 的所有相关信息都写入在 /proc/1/*
, 针对整个 Linux系统的相关参数:
fuser
: 有文件或文件系统找出正在使用该文件的进程
fuser [-umv] [-k [i] [-signal] ] file/dir
-u 处理进程的PID之外,同时列出该进程的拥有者
-m 后面接文件名,该文件名会主动提到该文件的最顶层,对 umount不成功很有效
-v 列出每个文件与进程和指令的完整相关性
-k 找出使用该文件/目录的PID,并试图使用 SIGKILL 终止该进程
-i 必须与-k 配合使用,在删除PID之前会先询问使用者
-signal 指定信号量,预设为 SIGKILL(9)
使用如下:
lsof
: 列出被进程所开启的文件名
lsof [-aUu] [+d]
-a 多项数据需要 同时成立 才可以显示出结果
-U 仅列出 socket文件类型
-u 接username,列出该使用者相关进程所开启的文件
+d 后面接目录,找出某个目录下已经被开启的文件
# 列出root用户的所有进程开启的socket文件,-a 选项就是用于连接多个不同的需求使用的
lsof -u root -a -U
# 列出root的bash程序所开启的文件
lsof -u root | grep bash
pidof
: 找出某个正在执行的程序的PID
pidof [-sx] program_name
-s 列出一个PID而不列出所有的PID
-x 同时列出该 程序 可能的 PPID 那个进程的PID
# 列出 systememd 以及 resylogd 这两个程序的PID
pidof systemd rsyslogd
最后
一起提高,慢慢变强