Linux基础知识与实操-篇八:定期任务执行与进程任务处理

例行工作安排

类似于定时任务、系统安排的任务提醒等

一般在任务中,有两个类型:

  • 例行性:每个一定的周期就需要执行的事项
    crontab 指令 处理循环执行的指令
  • 突发性:做完以后就没有了
    at 指令 处理仅执行一次就结束的指令

单一工作安排

要使用单一工作安排,就需要Linux系统上面必须有负责这个安排的服务,即atd 服务:
下面是我本机的 atd服务情况:
image

如果不是这个状态,就使用下面的命令处理:

#重新启动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 的执行流程如下:
image

/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
就是说,在某个时间点『再加几个时间后』才进行。

image

此外,使用at安排的工作,系统会将该选项at工作独立出bash环境,直接交给系统的atd 程序接管,因此当下达了at 的工作之后就可以立即脱机了,剩下的工作就完全交给Linux管理即可。

如果输入了错误的指令,可以通过atq 查看安排,并通过 atrm 进行移除

# 查看项目安排
atq
# 移除项目
atrm (jobnumber)

循环执行的任务

at 执行的任务限制类似,也需要下面两个文件限制使用者账号:
image

当用户使用功能contab 建立工作安排后,该项工作就被记录到/var/spool/cron中了,并且是以 账号 来作为判别的依据。

所以如果怀疑 系统中被植入了木马,就可以考虑查看var/log/cron 这个文件中是否有木马程序在执行

crontab [-u username] [-ll-el-r]

-u  只有root用户才可以执行这个任务,即帮助其他使用者建立/移除 crontab 工作安排
-e  编辑 crotab的工作内容
-l  查询crontab的工作内容
-r  移除所有的crontab 的工作内容,如果要仅仅移除一项,就可以使用-e去编辑

每项工作都有六个字段,这六个字段的含义如下:
image

image

如果是系统的例行性人物,可以直接编辑/etc/crontab文件实现 设置定时任务,只要编辑完该文件,将这个修改保存,cron的设定就会自动执行(如果没有马上执行,那么就需要重新启动crond服务:systemctl restart crond)
image

crond服务读取配置文件的位置

一般是从如下三个地方读取配置文件:

  • /etc/crontab
  • /etc/cron.d/*
  • /var/spool/cron/*

如果需要自己开发新的软件,该软件要拥有自己的crontab定时指令时,就可以将 配置文件放置到 /etc/cron.d 目录下
image

注意事项

在使用 上面的命令安排 例行操作时,要注意以下几点:

  • 避免资源分配不均
    image
  • 取消不必要的输出
    可以将错误信息重定向到/dev/null
  • 安全检验
  • 周 和 日月 不可共存

唤醒停机期间的任务

anacron 命令可以实现 在指定时间该执行却没有执行的任务(意外断电而无法执行的任务)

anacron命令也是每个小时被crond执行一次,然后ancron 再去检测相关的 任务有没有被执行,如果 有超过期限的工作,就执行该 安排任务,执行完毕或无需执行任何任务时,anacron就停止了

anacron 其实是一支程序并非一个服务!这支程序在 CentOS 当中已经进入 crontab 的排程喔!同时anacron 会每个小时被主动执行一次
image

进程任务处理

第16章

任务管理job control

后台执行

如果只有一个bash环境,又想要同时进行多个工作,可以将某些工作直接放到后台执行,就是在命令的后面加上一个&
image

这样在后台执行的命令就不怕被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不一样

使用如下:
image

-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  更加完整的输出

image

列出的主要字段如下:

  • 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 展示的字段与上面的命令稍有不同,但区别不大:
image

上面的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程序

image

其中第一行显示的信息如下:
image

第二行(Tasks…)表示:目前这个进程的总量与个别进程 处于什么状态

第三行(%Cpus…)表示:显示CPU的整体负载,每个项目可使用? 来查阅,特别注意wa项目,表示 I/O wait,一眼系统变慢就是由于 I/O 产生的问题比较大

第四行与第五行表示:目前的物理内存与虚拟内存的使用情况,swap要尽可能的小,如果swap很大,就表示系统的物理内存不足

第六行:当前在 top 程序中 输入指令时,限制转态的地方

下面就是 每个进程的详细信息了:
image

top 预设使用CPU使用率排序

pstree 可以表示进程之间的相关性

pstree [-A|U] [-up]

-A  各进程树之间的连接以ASCII字符连接,最常用
-U  各进程树之间的连接以 万国码 连接,但是在某些终端下可能会有错误
-P  列出每个process的PID
-u  同时列出每个process的所属账号关系

进程管理最常用的就是使用信号实现,常用的信号如下:kill -signal PID
image

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值,优先处理该进程,有如下注意点:
image

一般的调整方式如下:

  • 一开始执行程序就立即给予一个特定的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列出几次的意思

使用如下:
image

一般Swap最好不要被使用,最好不要超过 20 20% 20以上,超过了则说明物理内存不足了

uname : 查看系统与核心相关的信息

uname [-asrmpi]

-a  所有系统相关的信息,包括低下的数据都会被列出
-s  系统核心名称
-r  核心版本
-m  本系统的硬件名称
-p  CPU类型,与-m类型
-i  硬件平台

使用如下:
image

uptime : 观察系统启动时间与工作负载,就是top 命令最上面的哪一行
image

netstat : 追踪网络或socket文件:

netstat -[atunlp]

-a  将目前系统上面所以的联机、监听、socket数据都列出
-t  列出tcp网络封包的数据
-u  列出udp网络封包的数据
-n  不以服务的服务名称,以 端口号(port number) 来显示
-l  列出目前正在网络监听(listen)的服务
-p  列出该网络的服务进程PID

当前的udp服务如下:
image

各个字段的含义如下:
image

当前主机启动的服务:
image

dmesg : 分析核心产生的信息,比如系统开机时,系统会检测 系统的硬件,检测到的信息就在这里
image

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 :后面列出分区槽,可显示该分区槽的读写总量统计表

使用如下:
image

各个字段的含义如下:
image

查看系统所有磁盘的读写状态:
image

一般如果 I/O 部分特别忙碌,系统就会变的非常慢

特殊文件与进程

进程都是在内存当中!而内存当中的数据又都是写入到 /proc/* 这个目录下的,基本上,目前主机上面的各个进程的 PID 都是以目录的型态存在于 /proc 当中。 举例来说,我们开机所执行的第一支程序 systemd 他的 PID 是 1 , 这个 PID 的所有相关信息都写入在 /proc/1/*, 针对整个 Linux系统的相关参数:
image

fuser : 有文件或文件系统找出正在使用该文件的进程

fuser [-umv] [-k [i] [-signal] ] file/dir

-u  处理进程的PID之外,同时列出该进程的拥有者
-m  后面接文件名,该文件名会主动提到该文件的最顶层,对 umount不成功很有效
-v  列出每个文件与进程和指令的完整相关性
-k  找出使用该文件/目录的PID,并试图使用 SIGKILL 终止该进程
-i  必须与-k 配合使用,在删除PID之前会先询问使用者
-signal  指定信号量,预设为 SIGKILL(9)

使用如下:
image

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

image

最后

一起提高,慢慢变强

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值