openEuler 6 任务管理
uwupu 啦啦啦啦啦

任务管理

介绍

  • 在系统运维过程中,可能需要在某个预设的时间执行特定任务
  • 如:定时发送邮件、备份并清空日志文件等任务;
  • 任务的内容可以看做是一系列命令或一个脚本,我们需要在特定时间去执行;
  • at语法
    • at [-V] [-q 队列] [-f 文件名] [-mldbv] 时间
    • at -c 作业[作业…]

类型

计划执行,在特定时间运行一次:at

定期执行,按周期执行多次:cron

计划执行at

at命令可以指定Linux在特定时刻运行脚本;

atd是at的守护进程,在系统启动时会以后台模式运行;

atd定期检查系统上/var/spool/at目录中,通过at命令写入的任务;

这个命令至少需要指定一个命令和一个执行时间;

时间上,at命令可以只指定时间,也可以时间日期一起指定;

指定时间的方式有两种

绝对计时和相对计时

绝对计时

格式:at 时间 日期

  • 当前的时间:hh:mm,如果时间已经过去,则会在第二天执行;
  • 使用midnight、noon、teatime来指定时间;
    • teatime饮茶时间,一般指下午4点;
  • 采用12小时计时制,即在时间后面加上AM或PM来说明是上午还是下午;
  • 指定命令执行的具体日期,格式为:month daymm/dd/yydd.mm.yy 。指定日期必须在指定时间的后面;
  • 也可以用todaytommorrow表示今天或明天;

相对计时

格式:at now+数量 单位

  • 格式为now+count time-units
    • now就是当前时间
    • time-units是时间单位;
      • 这里可以是
        • minutes
        • hours
        • days
        • weeks
    • count是时间的数量,
      • 可以用数字,表示几天、几个小时等;

其他

可以使用todaytomorrow来表示日期;

示例

假定目前时间为 12:30 2020年6月7日,要在今天16:30执行某个命令,命令如下:

  • 绝对计时

    • at 16:30
    • at 4:30pm
    • at 16:30 today
    • at 16:30 7.6.20
    • at 16:30 6/7/20
    • at 16:30 Jun 7
  • 相对计时

    • at now+240 minutes

    • at now+4 hours

执行权限

对于at命令,需要定时执行的命令来自标准输入或者使用-f指定文件中读取执行;

如果at命令是su切换到用户shell执行的,那么当前用户会被认为是执行用户,所有错误和输出结果都会返回给这个用户;

对于其他用户,是否允许被使用at命令,主要在于/etc/at.allow/etc/at.deny文件中指定;

at.allow的优先级高于at.deny

其他管理命令

at TIME:增加任务

atq:查询所有任务

atq -c <id>:查询任务详细信息

atrm <id>:删除指定任务

使用

1
2
3
4
5
6
7
8
9
10
11
12
# 添加一个定时事件
[root@localhost tmp]# at now+3hours
warning: commands will be executed using /bin/sh
at Mon Nov 28 23:24:00 2022
at> echo "zzzcszczcs" > /tmp/aaw.log
at> <EOT>
job 6 at Mon Nov 28 23:24:00 2022
# 查询定时事件
[root@localhost tmp]# atq
6 Mon Nov 28 23:24:00 2022 a root
4 Mon Nov 28 21:23:00 2022 a root
5 Mon Nov 28 22:23:00 2022 a root
1
2
3
4
5
6
7
8
9
# 详细查询指定定时事件
[root@localhost tmp]# at -c 6
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
SHELL=/bin/bash; export SHELL
HISTCONTROL=ignoredups; export HISTCONTROL
HISTSIZE=1000; export HISTSIZE

周期性执行cron

周期性重复执行一些命令,使用cron;

  • cron会搜索/var/spool/cron目录,寻找以/etc/passwd文件中用户名命名的crontab文件,然后将crontab文件装入内存,即用户cron时间表
  • cron还将搜索/etc/crontab文件,即系统cron时间表
  • cron启动后,先检查是否存在需要运行的crontab文件;
    • 若没有则转入睡眠状态,释放系统资源;
    • 之后每分钟唤醒一次,查看当前是否有需要运行的命令。

crontab管理cron进程表格

crontab用于安装、删除或打印用于驱动cron后台进程的表格;

用户把需要执行的命令序列放到crontab文件中执行,每个用户都拥有自己的crontab文件;

crontab命令:

1
2
3
4
crontab -u # 设置指定用户的cron服务
crontab -l # 列出指定用户的cron服务详细内容
crontab -r # 删除指定用户的cron服务
crontab -e # 编辑指定用户的cron服务

crontab文件中的时间表

在crontab文件中指定需要执行的命令和执行时间;

文件每行有6个域,前5个域指定命令执行的时间,最后一个是要执行的命令,格式如下:

格式

1
minute hour day-of-month month-of-year day-of-week commands
参数 描述
minute 分钟 0~59
hour 小时 0~23
day-of-month 一个月的第几天 1-31
month-of-year 一年的第几个月 1~12
day-of-week 一周的周几 0 ~ 6
commands 执行的命令

如:每周一上午8:00执行命令

1
00 08 * * 1 commands

参数

参数 描述
* 所有取值范围内的数字
/ 每,如“*/5”指的是每5个单位;
- 从 一个数字 到另一个数字
, 离散的数字

如:晚上11点到早上8点之间每过2小时,在/tmp/test.txt文件中加入sleepy文本:

1
0 23-8/2 * * * echo "sleepy" >> /tmp/test.txt 

crontab文件 /etc/ctontab

这个配置文件针对系统的任务。

1
2
3
4
5
6
7
8
9
SHELL=/bin/sh
PATH=/usr/bin:/usr/sbin:/bin:/usr/lib/news/bin
MAILTO=root # 如果出现错误,或有数据输出,数据作为邮件发给这个账号
HOME=/
# run-parts01
* * * * root run-parts /etc/cron.hourly # 每小时执行一次/etc/cron.hourly里的脚本
02 4 * * * root run-parts /etc/cron.daily # 每天执行一次cron.daily文件里的脚本
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

crontab使用

  • crontab -l:查询当前定时事件;

  • crontab -e:编辑一个定时任务;

    • 将打开一个vim编辑器页面,然后使用上面的表达式可以创建任务;
  1. crontab -e 编辑一个定时任务;

    1
    [root@localhost tmp]# crontab -e
    1
    */1 * * * * echo "qqqqq" > /tmp/q.txt
  2. 查看当前定时任务

    1
    2
    [root@localhost tmp]# crontab -l
    */1 * * * * echo "qqqqq" > /tmp/q.txt
  3. 删除定时任务

    1
    [root@localhost tmp]# crontab -r
 评论