文章目录
前言
Linux系统中关于计划任务部分有两类,一类是一次性计划任务at,任务仅执行一次,另一类则是crond服务,可设定周期性计划任务。
一、一次性计划任务 at
1.1 安装at
# 使用本地ISO软件库安装at
[root@localhost ~]# yum install -y at
1.2 配置计划任务
[root@localhost ~]# at 10:25
at> yum makecache
at> <EOT> # Ctrl + D
job 1 at Sun May 22 10:25:00 2022
Can't open /var/run/atd.pid to signal atd. No atd running?
此时发现,atd服务并未运行,检查一下状态并启动:
[root@localhost ~]# systemctl status atd
● atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: inactive (dead)
[root@localhost ~]# systemctl start atd
[root@localhost ~]# systemctl status atd
● atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2022-05-22 10:24:29 CST; 1s ago
Main PID: 1634 (atd)
CGroup: /system.slice/atd.service
└─1634 /usr/sbin/atd -f
May 22 10:24:29 localhost.localdomain systemd[1]: Started Job spooling tools.
May 22 10:24:29 localhost.localdomain systemd[1]: Starting Job spooling tools...
再次设定一次性计划任务:
[root@localhost ~]# at 10:30
at> yum makecache
at> <EOT> # Ctrl + D 结束任务内容
job 2 at Sun May 22 10:30:00 2022
[root@localhost ~]#
[root@localhost ~]# echo "systemctl restart httpd" | at 11:00
job 3 at Sun May 22 11:00:00 2022
You have new mail in /var/spool/mail/root
[root@localhost ~]# at -l
3 Sun May 22 11:00:00 2022 a root
[root@localhost ~]#
1.3 查看计划列表
[root@localhost ~]# at -l
2 Sun May 22 10:30:00 2022 a root
1.4 删除计划任务
删除一次性计划任务,可通过atrm
命令删除对应序号的任务即可。
[root@localhost ~]# at -l
3 Sun May 22 11:00:00 2022 a root
[root@localhost ~]# atrm 3
[root@localhost ~]# at -l
二、周期性计划任务 crond
2.1 crond和crontab
crond是Linux系统用来定期执行命令或指定程序任务的一种服务或软件。
主要执行的计划任务有两类:
- 系统自身定期执行的任务,如备份数据、轮询日志等;
- 用户添加的任务,如定期同步时间、定期备份数据等。
crontab是crond服务用于设定具体计划任务的命令,crontab命令的守护进程便是crond。
2.2 命令
2.2.1 crontab常用命令
crontab常用的命令有:
crontab -l # 查看计划任务
crontab -e # 创建或编辑计划任务
crontab -r # 删除当前用户下的所有任务删除
crontab -u # root账号更新其他用户的任务
2.2.2 编辑计划任务
在使用crontab -e
在对计划任务创建或编辑时,此时会进入到文件编辑窗口下。
此时在文件内编辑加上具体的计划任务(时间周期、执行程序)即可。
这里放一条计划任务:
57 11 * * * /usr/sbin/logrotate -f /etc/logrotate.d/log-file &>> /dev/null
每一块区域具体的含义可见下面展示信息:
# 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
从而可知,上文中放置的计划任务表示的是每天的11点57分执行一次logrotate日志轮转操作(日志切割备份)。
另一个示例:
表示的是每周1、3、4的3:25执行tar压缩操作。
里面包含了一些特殊符号,具体的含义为:
- 逗号(,)来分别表示多个时间段,例如上面的“1,3,5”表示周一、周三和周五
- 减号(-)来表示一段连续的时间周期,例如字段“日”的取值为“12-15”时表示某月份的12~15日
- 除号(/)表示执行任务的间隔时间,例如“/2”表示每隔2 分钟执行一次任务
- 芯号(*)表示取值范围内所有数字,例如月份字段 “ * ”表示所有月份,即1-12月,每个月
2.3 注意点
1、在crond服务的计划任务中,需要执行的命令部分一定要用绝对路径
的方式来写,若不知道绝对路径,可用whereis
或which
命令进行查询
[root@localhost ~]# whereis locate
locate: /usr/bin/locate /usr/share/man/man1/locate.1.gz
[root@localhost ~]# which locate
/usr/bin/locate
2、每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron
下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,该文件是不可直接编辑的,只可以用crontab -e
来编辑
3、新创建的cron job不会立马执行,至少要等2分钟才能执行,可重启crond服务来立即执行
systemctl restart crond
4、%
在crontab文件中表示“换行”,因此假如脚本或命令中含有%
,需要使用\%
来进行转义
2.4 黑白名单机制
/etc/at.{allow, deny}
/etc/cron.{allow, deny}
*.deny (黑名单)默认存在,当没有白名单时,黑名单里的用户不能使用计划任务;
*.allow (白名单)默认不存在,若白名单存在且里面没有标明用户,则只有root可以使用计划任务;若白名单内有用户列表,则只有列表中的用户可以使用计划任务;
若黑白名单都不存在,则只有root可以使用计划任务。
[root@localhost ~]# ls /etc/*.deny
/etc/at.deny /etc/cron.deny /etc/hosts.deny
[root@localhost ~]# ls /etc/*.allow
/etc/hosts.allow
[root@localhost ~]# cat /etc/at.deny
[root@localhost ~]# cat /etc/cron.deny
[root@localhost ~]#