Linux之计划任务

作业管理:

Linux的作业控制:

    前台作业:通过终端启动,且启动后一直占据终端

    后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)

如何让作业运行与后台?    

    运行总的作业:  ctrl+z

    尚未启动的作业: COMMAND &

后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业,如果希望送往后台要剥离终端的关系

    nohup COMMAND &    或  screen;COMMAND

查看所有作业:

    jobs

作业控制:

    fg [[%]JOB_NUM]:把指定的后台作业调回前台; 

    bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行;

    kill [%JOB_NUM]:终止指定的作业;

并行运行:

同时运行多个进程,提高效率,有三种方法

(1)

    vim all.sh

    f1.sh&

    f2.sh&

    f3.sh&

(2)

    (f1.sh&);(f2.sh&);(f3.sh&)

(3)

    { f1.sh& f2.sh& f3.sh& }

进程的优先级:

进程优先级调整:

    静态优先级: 100-139

    进程默认启动时的nice值为0,优先级为120

    只有根用户才能降低nice值(提高优先性)

nice 命令:

     nice [OPTION] [COMMAND [ARG]…] 

renice 命令:

    renice [-n] priority pid …

查看;

    ps axo pid,comm,ni


计划任务:

Linux任务计划,周期性任务执行

未来的某时间点执行一次任务

    at

    batch :系统自行选择空闲时间去执行此处指定的任务

周期性运行某任务

    cron

at 命令: at [option] TIME

常用选项:

    -V :显示版本信息

    -l :列出指定队列中等待运行的作业

    -d :删除指定的作业,相当于 atrm

    -c :查看具体作业任务

    -f /path/from/somefile :从指定的文件中读取任务

    -m :当任务被完成后,将给用户发送邮件,即使没有标准输出

注意:作业执行命令的结果中的标准输出和错误以邮件通知给相关用户

TIME : 定义出什么时候进行at这项任务的时间

HH:MM [yyyy-mm-dd]

noon,midnight,teatime(4pm)

tomorrow

now+#{minutes,hours,days,weeks}

HH:MM 02:22

    在今日的HH:MM 进行,若该时刻已过,则明天此时执行该任务

HH:MM yyyy-MM-DD 04:30 2016-09-20

    规定在某年某月的某一天的特殊时刻进行该项任务

HH:MM[am|pm][Month][Date]

    04pm March 17

    17:20 tomorrow

HH:MM[am|pm] + number [minutes|hours|days|weeks]

    在某个时间点再加几个时间后才进行该项任务

    now + 5 minutes

    04pm + 3 days

at任务:

执行方式:

1)交互式    2)输入从定向    3) at -f 文件

依赖与atd服务,需要启动才能实现at任务

at队列存放在 /var/spool/at 目录中

通过 /etc/at.{allow,deny}控制用户是否能执行at任务;先寻找 /etc/at.allow 文件,文件中的使用者才能使用at,没有在这个文件中的使用者则不能使用at(即使没有写在 at.deny 当中),如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者则可使用 at 命令


at 的三种方式添加任务

1) 

[root@localhost Desktop]# at 20:00
at> ls /
at> <EOT>            # ctrl+d 结束
job 7 at 2016-09-09 20:00
[root@localhost Desktop]# at -l    #查看队列中将要运行的任务
7	2016-09-09 20:00 a root

2) 文件重定向

[root@localhost Desktop]# echo "ls /" > k.txt
[root@localhost Desktop]# cat k.txt 
ls /
[root@localhost Desktop]# at 21:00 < k.txt
job 8 at 2016-09-09 21:00
[root@localhost Desktop]# at -l
82016-09-09 21:00 a root
72016-09-09 20:00 a root

3) 直接读取文件,和文件重定向差不多

[root@localhost Desktop]# at 22:00 -f k.txt
job 9 at 2016-09-09 22:00
[root@localhost Desktop]# at -l
92016-09-09 22:00 a root
82016-09-09 21:00 a root
72016-09-09 20:00 a root


周期性任务计划: cron

    相关的程序包

    cronie :主程序包,提供crond守护进程及相关辅助工具

    cronie-anacron:cronie的补充程序;用于监控cronie任务执行状况;如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次该任务

    crontabs :包括CentOS 提供系统维护任务

首先确保crond守护进程处于运行状态

    CentOS 7 : systemctl status crond

    CentOS 6 : service crond status

计划周期性执行的任务提交给crond,到指定时间会自动运行

    系统cron任务 : 系统维护作业

        /etc/crontab

    用户cron任务:

        crontab 命令

日志: /var/log/cron

系统 cron 任务: /etc/crontab

注释行以 # 开头 ,详情参见 man 5 crontab

[root@centos7 Desktop]# cat /etc/crontab 
SHELL=/bin/bash
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

 例如晚上九点十分运行echo命令:

12 21 * * * root /bin/echo "good"

blob.png

时间表示法:

(1) 特定的值: 给定时间点有效取值范围内的值

(2) *  : 给定时间点上有效取值范围内的所有值  表示"每…"

(3) 离散取值 : #,#,#

(4) 连续取值 : #-#

(5) 在指定时间范围内上,定义步长 : */#  : # 表示步长

    比如: 每三个小时echo命令: 0 */3 * * * root /bin/echo "good"

@reboot Run once after reboot.

@yearly 0 0 1 1 *

@annually     0 0 1 1 * 

@monthly 0 0 1 * * 

@weekly 0 0 * * 0

@daily 0 0 * * *

@hourly 0 * * * *

系统计划任务配置文件:

/etc/crontab

[root@centos7 cron.d]# ls -d1 /etc/cron.*
/etc/cron.d
/etc/cron.daily
/etc/cron.deny        #拒绝名单,若有用户在此文件,则该用户没有权限添加计划任务
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly

anacron 系统 :

运行计算机关机时cron不运行的任务,Centos6以后版本取消anacron服务,由crond服务管理

假设计算机没有一直关机

对笔记本,台式机,工作站及其他不一直开机的系统很重要

对偶尔要关机的服务器很有用

配置文件 :/etc/anacrontab 负责执行 /etc/cron.daily /etc/cron.weekly /etc/cron.monthly中的系统任务 ; /etc/cron.hourly 由 /etc/cron.d/0hourly 执行

blob.png

run-parts dir  :运行dir目录下所有的程序

字段1:如果在这些日子里没有运行这些任务…… 

字段2:在重新引导后等待这么多分钟后运行它

字段3:任务识别器,在日志文件中标识

字段4:要执行的任务

当执行任务时,更新/var/spool/anacron/文件时间戳

管理临时文件:

rhel6.0使用/etc/cron.daily/tmpwatch定时清除临时文件。 

rhel7.0使用systemd-tmpfiles-setup服务实现 

    配置文件: 

        /etc/tmpfiles.d/*.conf 

        /run/tmpfiles.d/*.conf 

        /usr/lib/tmpfiles/*.conf

    /usr/lib/tmpfiles.d/tmp.conf 

        d /tmp 1777 root root 10d 

        d /var/tmp 1777 root root 30d 

命令:

    systemd-tmpfiles –clean|remove|create  configfile

用户cron :

crontab 命令定义,每个用户都有专用的cron任务文件: /var/spool/cron/USERNAME

crontab 命令:

        crontab [-u user] [-l | -r | -e] [-i] [-s]

    -l : 列出所有任务

    -e : 编辑任务

    -r : 移除所有任务

    -i : 同 -r 一同使用,以交互模式移除指定任务

    -u user : 仅root可运行,指定用户管理cron任务

控制用户执行计划任务,和at 命令类似

/etc/cron.{allow,deny}

at 和 crontab的区别

一次性作业使用 at

重复性作业使用 crontab

at 和 crontab 命令区别
Create at time crontab -e
List at -l crontab -l
Details at -c jobnum
Remove at -d jobnum crontab -r
Edit crontab -e

没有被重定向的输出会被邮寄个用户

根用户能够修改其他用户的作业

注意:运行结果的标准输出和错误以邮件通知给相关用户

(1) COMMAND > /dev/null

(2) COMMAND &> /dev/null

对于cron任务来讲,% 有特殊用途;如果在命令中要使用 % ,则需要转义,不过,如果把 % 放置单引号中,也可以不用转义

思考:

(1) 如何在秒级别运行任务 ?

* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done

(2) 如何实现每7分钟运行一次任务? 

sleep命令: sleep NUMBER[SUFFIX]… 

    SUFFIX: s: 秒, 默认 m: 分 h: 小时 d: 天



练习测试:

1、每4小时备份一次/etc目录至/backup目录中,保存的文 件名称格式为“etc-yyyy-mm-dd-HH.tar.xz” 

[root@localhost backup]# crontab -l
0 */4  * * * . /backup/etcback.sh
[root@localhost backup]# cat etcback.sh 
#!/bin/bash
tar -Jcf /backup/etc-date +%F-%H.tar.xz /etc &> /dev/null

2、每周2, 4, 7备份/var/log/messages文件至/logs目录中 ,文件名形如“messages-yyyymmdd” 

[root@localhost bin]# cat backupmessage.sh 
#!/bin/bash
cp -a /var/log/messages /logs/messages-date +%F |tr -d '-'
[root@localhost bin]# crontab -l
0 0 0 * 2,4,7 /usr/local/bin/backupmessage.sh

3、每两小时取出当前系统/proc/meminfo文件中以S或M开 头的信息追加至/tmp/meminfo.txt文件中 

[root@localhost bin]# crontab -l
0 */2 * * * /usr/local/bin/meminfo.sh
[root@localhost bin]# cat meminfo.sh 
#!/bin/bash
cat /proc/meminfo | grep "^[SM]" >> /tmp/meminfo.txt

4、工作日时间,每10分钟执行一次磁盘空间检查,一旦发现 任何分区利用率高于80%,就执行wall警报

[root@localhost bin]# cat walldisk.sh 
#!/bin/bash
num=df | grep "/dev/sd.*" | tr -s ' '|cut -d' ' -f5|cut -d% -f1|sort -n |tail -1
if [ $num -gt 80 ];then
wall "the disk will full"
fi
[root@localhost bin]# crontab -l
*/10 * * * * /usr/local/bin/walldisk.sh


类似文章