crontab在linux和mac里其实有非常大的作用,不仅是这种工具的能力强大,更重要的意义在于合理的运用定时任务可以极大的提升工作效率,比如在服务器上设定好数据的抓取和推送工作,在本地工程机上定时执行某些脚本,定期备份本地的某些重要数据,并且合理的管理他们的调度计划。crontab能力虽强,但毕竟是个低频命令,每次都用到现查现的十分抓瞎。把自己遇到的场景和用过的操作记录下来,希望下次遇到的时候能硬气一把。

定时的种类

定时调度(schedule)是有两种的,一种重复一种不重复,就像手机定闹钟还有个工作日9点叫醒,周末别烦老子,但是3个小时以后提醒我去扫地这两种场景的区分。所以在Linux里定时通过两个命令来解决这两个不同的场景需求,crontab对应那种需要重复触发的定时任务,at对应那种只需在指定的时间点出发一次的场景。

crontab

crontab的格式

分 时 日 月 星期 要运行的命令
*   第1列分钟0~59
*   第2列小时0~23(0表示子夜)
*   第3列日1~31
*   第4列月1~12
*   第5列星期0~6(0表示星期天)
*   第6列要运行的命令

crontab文件

这个crontab文件一开始令我有点迷惑。迷惑的点主要是:

  1. 既然cron服务已经启动了,就可以启用定时任务
  2. crontab -e就打开crontab的任务编辑,在这之前我没创建定时文件,那我编辑了个寂寞?这些数据都被保存到哪里去了?

一顿搜索外加两次关机然后我知道了,如果没创建过crontab文件而直接crontab -e,这种方式提交的定时任务记录是放在系统临时文件里的,关机重启就没了。所以稳妥一点就需要创建crontab文件。在Linux系统和Mac系统中crontab文件默认放在/ect/crontab下,cron服务启动时会从这个位置加载任务。文件放在ect下不方便备份,所以完全可以放在$HOME,或者某个被备份的文件夹下,然后使用symbol link链接到/ect/crontab

在自己选定的路径下创建crontab_file,并link:

touch $HOME/crontab_mac
ln -s $HOME/crontab_mac /ect/crontab

另外,crontab命令支持输入文件,以文件内容提交crontab任务,这种方式也会重启失效。

crontab的常用命令

编辑crontab文件

crontab -e

列出crontab内容

crontab -l

crontab服务的重启关闭,开启

  • Mac系统下

    sudo /usr/sbin/cron start
    sudo /usr/sbin/cron restart
    sudo /usr/sbin/cron stop
    
  • Ubuntu:

    sudo /etc/init.d/cron start
    sudo /etc/init.d/cron stop
    sudo /etc/init.d/cron restart
    

at

在指定的时间执行指定的任务,只执行一次。

**通过管道提交任务到at**:

echo "cd $HOME" | at now + 24 hours #24小时后执行

at的格式

at now + 24 hours #24小时后执行
at 17:30 03/10/2022 ## 指定具体时间 Mac

at支持的时间格式,在Mac和Linux下是不同的。

在Mac如下:

YYYY-MM-DD是不合法的,输入就会遇到at: garbled time的错误。

在Linux则可以用YYYY-MM-DD的格式。

at的命令

列出所有job

at -l
## or
atq

列出某个job的详情

at -c job_number

这个命令会列出一大坨,最后会列出要执行的命令。仔细观察一下前面的一大坨,其实是在初始化shell环境,做一些初始化,载入变量等等的事情,从这列也能感觉出一点linux内核的设计逻辑。