Linux Auto Run : crontab
crontab的使用
任务调度
Linux下的任务调度分为两类:系统任务调度和用户任务调度。
Linux系统任务是由 cron (crond) 这个系统服务来控制的,这个系统服务是默认启动的。用户自己设置的计划任务则使用crontab 命令。
crontab 命令
1 | crontab [-u user] file |
-u user
:用于设定某个用户的crontab服务;file
: file为命令文件名,表示将file作为crontab的任务列表文件并载入crontab;-e
:编辑某个用户的crontab文件内容,如不指定用户则表示当前用户;-l
:显示某个用户的crontab文件内容,如不指定用户则表示当前用户;-r
:从/var/spool/cron目录中删除某个用户的crontab文件。-i
:在删除用户的crontab文件时给确认提示。
crontab文件
- crontab有2种编辑方式:
- 直接编辑
/etc/crontab
文件,其中/etc/crontab
里的计划任务是系统中的计划任务, - 通过
crontab –e
来编辑用户的计划任务;- 每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。
- 所有用户定义的crontab 文件都被保存在
/var/spool/cron
目录中。其文件名与用户名一致。
- 直接编辑
- crontab中的command尽量使用绝对路径,否则会经常因为路径错误导致任务无法执行。
- 新创建的cron job不会马上执行,至少要等2分钟才能执行,可从起cron来立即执行。
%
在crontab文件中表示“换行”,因此假如脚本或命令含有%,需要使用\%
来进行转义。
配置文件实例:
1 | SHELL=/bin/bash |
@reboot
表示重启开机的时候运行一次。还有很多类似参数如下:
1 | string meaning |
1 | # For details see man 4 crontabs |
在以上各个字段中,还可以使用以下特殊字符:
*
代表所有的取值范围内的数字,如月份字段为*
,则表示1到12个月;/
代表每一定时间间隔的意思,如分钟字段为*/10
,表示每10分钟执行1次。-
代表从某个区间范围,是闭区间。如2-5
表示2,3,4,5
,- 组合:小时字段中
0-23/2
表示在0~23点范围内每2个小时执行一次。
- 组合:小时字段中
,
分散的数字(不一定连续),如1,2,3,4,7,9
。
查看crontab的日志记录和状态
tail -f /var/log/cron
观察查看cron运行日志(/var/log/cron.log),但是并未找到相关文件,原因是ubuntu默认没有开cron日志,执行命令:
1 | sudo vim /etc/rsyslog.d/50-default.conf |
找到cron.log相关行,将前面注释符#去掉,保存退出,重启rsyslog:
1 | sudo service rsyslog restart |
执行less -10 /var/log/cron.log
再次查看cron运行日志,log出来了,提示如下信息:
1 | No MTA installed, discarding output |
原因是cron把屏幕输出都发送到email了,而当前环境并未安装email server,于是系统报错,解决方面就是不要直接向屏幕输出内容,而是重定向到一个文件。
1 | cd /var/spool/mail/ |
1 | service cron status # ubuntu |
实例
其他自动化方法
https://zhuanlan.zhihu.com/p/35402730
https://blog.csdn.net/qq_35440678/article/details/80489102
开题缘由、总结、反思、吐槽~~
参考文献
Linux Auto Run : crontab
http://icarus.shaojiemike.top/2023/04/11/Work/software/linux-sys/LinuxAutoRun/