Linux 定时任务小记(at、crontab)

时间:2022-04-25 21:59:56

引言:了解定时任务的初心就是为了能定时签到,然后再顺便学习Linux。

操作系统:Centos 7

Linux上用于处理定时任务的有两个工具:at、crontab

名称 应用场景 对应服务
at 执行一次 atd
crontab 重复执行 cron

atd 的启动方式与 at的使用方法

启动服务

➜  ~ systemctl restart atd     # 重启atd服务
➜  ~ systemctl enable atd      # 将atd服务设置为开机自启
➜  ~ systemctl status atd      # 查看atd服务的当前状态
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2018-03-14 21:20:56 CST; 13s ago
 Main PID: 1002 (atd)
   CGroup: /system.slice/atd.service
           └─1002 /usr/sbin/atd -f

Mar 14 21:20:56 VM_centos systemd[1]: Started Job spooling tools.
Mar 14 21:20:56 VM_centos systemd[1]: Starting Job spooling tools...

at的控制方式
1、查看/etc/at.allow ,只有在这个文件中的用户才可使用at
2、/etc/at.allow不存在时,则查看/etc/at.deny,在这个文件中的用户则不能使用at
3、如果两个文件都不存在,则只用root才可使用
at的使用方法

at [-mldv] time
  • -m:at工作完成后,以email通知用户
  • -l:at -l 相当于atq,列出所有at任务
  • -d:at -d 相当于atrm,后面跟任务number,取消一个at工作
  • -v:可以使用较明显的时间格式列出 at 排程中的工作列表 # 好像没什么用
  • -c:列出后面的该项工作的指令内容
  • time:
时间格式 示例 描述
HH:MM 04:00 在今天的HH:MM执行
HH:MM YYYY-MM-DD 04:00 2015-07-30 指定在某年某月的某一天执行
HH:MM[am|pm] + number [minutes|hours|days|weeks] now + 5 minutes| 04pm + 3 days 在指定的时间点执行

如果想让任务执行的信息显示在终端上,

➜  ~ tty  # 查看当前终端
/dev/pts/0
➜  ~ at now + 3 minutes
at> echo "hello" > /dev/pts/0 # 三分钟后,会在/dev/pts/0 终端输出 hello
at> <EOT> # ctrl + d 退出
job 14 at Wed Mar 14 22:02:00 2018
➜  ~ at now + 4 minutes
at> echo "hello 2" > /dev/pts/0
at> <EOT>
job 15 at Wed Mar 14 22:03:00 2018
➜  ~ at -l  # 查看当前at工作列表
14      Wed Mar 14 22:02:00 2018 a root
15      Wed Mar 14 22:03:00 2018 a root
➜  ~ atq # 等同于 at -l
14      Wed Mar 14 22:02:00 2018 a root
15      Wed Mar 14 22:03:00 2018 a root
➜  ~ atrm 14 # 移除编号为14的工作
➜  ~ atq
15      Wed Mar 14 22:03:00 2018 a root
➜  ~

备注:系统有空时才会进行背景任务(系统不会优先处理at任务)

crontab的启动方式及使用方法

at的控制方式

  • /etc/cron.allow 在此文件中才可使用crontab
  • /etc/cron.deny 在此文件中不允许使用crontab
    注:/etc/cron.allow 比/etc/cron.deny优先级高

语法

crontab [-u username] [-l|-e|-r]

选项与参数:
-u :只有root 才能进行这个任务,亦即帮其他使用者建立/移除crontab 工作排程; -e :编辑crontab 的工作内容 -l :查阅crontab 的工作内容 -r :移除所有的crontab 的工作内容,若仅要移除一项,请用-e 去编辑。
➜  ~ 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

示例:

crontab -e # 进入文件后

编辑如下内容,下面表示每分钟执行一次test.py文件

*/1 * * * /root/test.py

下面这个是python文件的前两行注释,用于申明用什么程序去执行该文件

#!/root/bin/python
# Python file

import time

with open('/tmp/cron.log', 'a') as f:
    f.write(time.asctime()+ '\n')

如果任务上述步骤没有日志产生的话,那就给文件添加可执行权限

chmod +x /root/test.py

等一分钟去/tmp目录下查看,大概会看见如下所示的内容

➜  ~ cat /tmp/cron.log
Wed Mar 21 23:36:01 2018
Wed Mar 21 23:37:01 2018
Wed Mar 21 23:38:01 2018
Wed Mar 21 23:39:01 2018
Wed Mar 21 23:40:01 2018
Wed Mar 21 23:41:01 2018

参考资料:鸟哥的Linux私房菜