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


    例行工作安排

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

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

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

    单一工作安排

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

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

    #重新启动atd服务
    systemctl restart atd
    
    # 服务开机自启
    systemctl enable atd
    
    # 查看atd目前状态
    systemctl status atd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    有了该服务的支持,就可以实现 单次的工作安排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
    就是说,在某个时间点『再加几个时间后』才进行。
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    image

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

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

    # 查看项目安排
    atq
    # 移除项目
    atrm (jobnumber)
    
    • 1
    • 2
    • 3
    • 4

    循环执行的任务

    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去编辑
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    每项工作都有六个字段,这六个字段的含义如下:
    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]#
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    但是,这里要注意一点,& 的作用是将任务放到后台执行,表示放入这个终端的后台,如果 该终端退出了,那么该任务也就被强制终止了,如果要实现 退出终端,任务继续执行,就需要使用nohup 命令了,它可以实现让命令在 该用户脱机或注销系统后继续执行该命令

    # 在终端 前台执行
    nohup [指令与参数]
    
    # 在终端 后台执行
    nohup [指令与参数] &
    
    • 1
    • 2
    • 3
    • 4
    • 5

    除此之外,我们还可以将当前的工作暂停:比如当前正在使用vim编辑文件,如果要使用shell, 可以使用ctrl+Z实现暂时换出vim,回到shell环境。

    如果要查看有多少个工作在后台,可以通过如下命令实现:

    jobs [-lrs]
    
    -l  列出job number 与指令串之外,同时列出PID的号码
    -r  仅列出正在背景运行的任务
    -s  仅列出正在背景中暂停的工作
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在查找到在后台的工作后,就可以通过如下的命令实现将 后台的工作放到前台继续处理:

    fg %jobNumber
    
    
    %jobnumber  jobNumber 为工作号码,这里的% 必须要有
    
    • 1
    • 2
    • 3
    • 4

    使用如下:

    # 列出后台任务
    [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]#
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    下面考考虑该如何管理后台的工作:kill

    kill -signal %jobnumber
    
    -l  列出目前kill可以使用的信号有哪些
    signal  表示后面那个任务的 操作指示(在Linux开发 的信号中有详细讲解)
    	-1  重新读取一次参数的配置文件,类似reload
    	-2  由键盘输入 ctrl-C同样的动作
    	-9  立刻强制删除一个工作
    	-15  以正常的进程方式终止一个工作,与-9不一样
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    使用如下:
    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  更加完整的输出
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    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程序
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    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的所属账号关系
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    killall指令可以实现发出SIGHUP 信号,终止整个服务,不仅仅是终止一个进程那么简单了

    killall [-iIe] [command name]
    
    -i  交互式操作
    -e  exact,表示后面接的 command name要一致,但整个完整的指令不能超过15个字符
    -l  指令名称,忽略大小写
    
    • 1
    • 2
    • 3
    • 4
    • 5

    进程的执行顺序

    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
      
      • 1
      • 2
      • 3

      一般在执行有些不重要的进程时,就可以调大nice值,比如备份系统资源这样的工作

    • 调整某个已经存在的 PID 的nice值:renice

      renice [number] PID 
      
      PID  某个进程的ID(从 ps命令或其他进程观察程序中获取)
      
      • 1
      • 2
      • 3

    系统资源查看

    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列出几次的意思
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    使用如下:
    image

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

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

    uname [-asrmpi]
    
    -a  所有系统相关的信息,包括低下的数据都会被列出
    -s  系统核心名称
    -r  核心版本
    -m  本系统的硬件名称
    -p  CPU类型,与-m类型
    -i  硬件平台
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    使用如下:
    image

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

    netstat : 追踪网络或socket文件:

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

    当前的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 :后面列出分区槽,可显示该分区槽的读写总量统计表
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    使用如下:
    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    使用如下:
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    pidof: 找出某个正在执行的程序的PID

    pidof [-sx] program_name
    
    -s  列出一个PID而不列出所有的PID
    -x  同时列出该 程序 可能的 PPID 那个进程的PID
    
    # 列出 systememd 以及 resylogd 这两个程序的PID
    pidof systemd rsyslogd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    image

    最后

    一起提高,慢慢变强

  • 相关阅读:
    计算机毕业设计 SSM学校图书借阅管理系统 图书馆借阅管理系统 图书借阅系统Java
    java基于ssm框架的学生在线考试系统
    SpringCloud之Hystrix
    canvas画布绘制线条样式:粗细,圆角,拐角等
    【后端学习笔记·Golang】邮箱邮件验证
    基于PHP+MySQL保险理赔系统的设计与实现
    大数据_数据中台_数据分层
    js中的拖拽
    STM32的四种输出模式
    图形预处理工具_CogAffineTransformTool
  • 原文地址:https://blog.csdn.net/qq_45966201/article/details/128136903