Linux 定时任务管理

2024-01-07 17:20:18

这篇笔记主要记录一些常见的Linux定时任务

一、定期任务

crontab

最小粒度,1分钟

守护进程 crond

每分钟扫描一次下列文件
? ? /var/spool/cron/* ?命令生成
? ? /etc/crontab ? ? ? 文本文件
? ? /etc/cron.d/* ? ? ?自定义的定时任务

任务格式:分 时 日 月 周

编辑方式

? ? 1、crontab 命令
? ? 2、/etc/crontab 文件
? ? 3、/etc/cron.d/* 文件

限制文件

? ? /etc/cron.allow ?在文件中的可以使用crontab

? ? /etc/cron.deny ? 不在文件中的用户可以使用crontab (默认存在空文件)

? ? /etc/security/access.conf

运行方式

? ? 1、crontab创建工作

? ? 2、系统会将工作以文本格式写入 /var/spool/cron/

? ? 3、创建用户名的定时文件

? ? 4、等待crond执行,观察日志输出

输出日志

/var/log/cron

配置方式

1、命令配置 常用
设置:crontab [-u username] [-l|-e|-r]
    -u 指定用户,不添加就是当前用户
    -l 列出crontab列表,默认当前用户
    -e 编辑crontab
    -r 移除所有的定时任务,建议编辑处理
内容格式:
    0 12 * * * mail -s "at 12:00" test_user < /home/test_user/.bashrc
    分 时 日 月 周 |<==============指令串========================>|
    特殊字符:
        * 任意时刻
            * 任意时刻
        , 多个值 
            0 3,6 * * * command 每天3点整和6点整都执行
        - 一段时间
            20 8-12 * * * command 每天8:20-12:20 ,执行4次
        / 每隔多久
            */5 * * * * command 每隔5分钟执行一次
案例:
    crontab -e
    进入vi界面,输入i,写入如下内容,按esc,输入q退出
    0 12 * * * mail -s "at 12:00" test_user < /home/test_user/.bashrc
2、编辑/etc/crontab 较少用

注意:编辑/etc/crontab可能是写入到内存的,需要重启crond服务才会生效

编辑内容:

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
0 12 * * * root echo `date` > /tmp/abc 

重启crond服务

3、编辑其他目录 一般不用

注意:放在下列目录下的文件必须是可执行文件!

/etc/cron.d/ ? ? ?

/etc/cron.daily/ ?

/etc/cron.hourly/ ?

/etc/cron.monthly/

/etc/cron.weekly/

注意事项

? ? 1、日月和周不能同时存在

? ? 2、编辑/etc/crontab可以指定谁接受结果邮件

? ? 3、crond日志在/var/log/cron

? ? 4、用户密码过期,定时任务将会执行失败

? ? 5、定时任务如果有大量输出,需要将结果重定向,可能会出现sendmail的僵尸进程


anacron

用于检测系统未进行的crond任务,没仔细研究过

实现原理

crontd每小时执行一次 anacron 程序,anacron 会读取时间戳,对比上次记录的 anacron 执行时间,如果时间有差异,代表存在未执行的任务,然后会执行未执行的任务

配置文件

放置在/etc/cron.hourly/0anacron

执行流程

  1. 由 /etc/anacrontab 分析到 cron.daily 这项工作名称的天数为 1 天
  2. 由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 的时间戳
  3. 由上个步骤与目前的时间比较,若差异天数为 1 天以上 (含 1 天),就准备进行指令
  4. 若准备进行指令,根据 /etc/anacrontab 的设定,将延迟 5 分钟 + 3 小时,看 START_HOURS_RANGE 的设定
  5. 延迟时间过后,开始执行后续指令,即?run-parts /etc/cron.daily 这串指令
  6. 执行完毕后, anacron 程序结束

这个是个开机自启的程序,会影响开机速度,如果长时间关机,在开机机后一个小时CPU会忙碌,因为anacron会执行未执行的定时任务


二、定时任务

at

可以在指定时间执行,不过平时用的少,一般crond就能满足绝大多数的需求了

守护进程 atd

运行方式

  1. ?at 指令产生要运行的工作
  2. ?将工作以文本格式写入/var/spool/at/ 目录内
  3. 等待atd服务执行

限制文件

  • /etc/at.allow 只有在文件中的用户可以使用at
  • /etc/at.deny ?不在文件中的用户可以使用at ?(默认存在空文件)
  • 都没有,就只有root能执行at
  • 上述情况一般不会同时存在

使用方式

1、设置
at [-mldv] Time
    -m 结束后以邮件方式通知
    -l 等价于atq,列出当前系统上该用户的at列表
    -d 等价于atrm,取消一个at列表中的工作
    -v 列出at列表,显示较详细
    -c 列出某个工作的实例指定内容

时间格式:
    HH:MM   04:00   今天的4点执行,如果已经过了,就明天4点执行
    HH:MM YYYY-MM-DD 04:00 2015-07-30  指定某一时刻执行
    HH:MM[am|pm] [Month] [Date]  04pm July 30  指定某一时刻执行
    H:MM[am|pm] + number [minutes|hours|days|weeks] 
        now + 5 minutes  五分钟后执行
        04pm + 3 days    三天后的下午四点执行
    注意:单位后面要带s,命令最好使用绝对路径 *

2、查看

at -c 工作号码
at -l 任务清单
3、工作目录

at 会将下达命令的目录作为工作目录,所以命令和文件都要写绝对路径,以防万一

4、输出结果

at 的执行与终端机环境无关,所有输出结果发送到mailbox

如果执行的命令没有输出,就不会发送邮件,可以使用-m强制发送邮件

5、案例
编辑:
    at now + 5 minutes
    at> /bin/mail -s "testing at job" root < /root/.bashrc
    at> /bin/sync
    at>  <EOT> 按Ctrl+d 结束输入
    job 1 at Fri Oct 27 00:26:00 2023
查看:
    at -c 2 查看工作内容
    atq 查看工作列表
取消:
    at -d 2
    或者
    atrm 2
6、其他
man at
NAME
       at, batch, atq, atrm - 排队、检查或删除以后要执行的作业。

总览
       at [-V] [-q 队列] [-f 文件] [-mldbv] 时间 at -c 作业 [作业...]  atq [-V] [-q 队列] [-v]
       atrm [-V] 作业 [作业...]
       batch [-V] [-q 队列] [-f 文件] [-mv] [时间]

描述
       at 和 batch 从标准输入或一个指定的文件读取命令,这些命令在以后某个时间用 /bin/sh 执行。

       at      在指定的时间执行命令。

       atq     列出用户的等待执行的作业;在用户是超级用户的情况下,列出所有人的作业。

       atrm    删除作业。

       batch   在系统负载水平允许的时候执行命令;换句话说,当平均负载降到低于0.8,或降到了在  atrun  文件中指定的期望值时运行。  译注:atrun
               文件参见 atd 手册页。

三、空闲时任务

batch

用来在系统空闲时执行的任务,平时基本没在用,没怎么了解太深

工作时间

在CPU负载低于0.8时,进行下达的命令

使用方式

batch
at>/usr/bin/updatedb
at><EOT>    # ctrl+d
job 2 at Fri Oct 27 00:30:00 2023

管理软件

通过使用可以看出与at的管理方式相同,atq,atrm管理

文章来源:https://blog.csdn.net/weixin_43839586/article/details/135423304
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。