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文件一开始令我有点迷惑。迷惑的点主要是:
- 既然cron服务已经启动了,就可以启用定时任务
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内核的设计逻辑。