为archlinux配置cron
cron的作用:cron可以用来周期性地自动执行一些命令。
cron的实现:cron有很多实现版本,例如:cronie, dcron, fcron, bcron, vixie-cron,我安装的是 cronie
安装的方法:
pacman -S cronie
安装完成后,cronie 在系统中增加的文件:
cronie /etc/ cronie /etc/anacrontab cronie /etc/cron.d/ cronie /etc/cron.d/0hourly cronie /etc/cron.daily/ cronie /etc/cron.deny cronie /etc/cron.hourly/ cronie /etc/cron.hourly/0anacron cronie /etc/cron.monthly/ cronie /etc/cron.weekly/ cronie /etc/pam.d/ cronie /etc/pam.d/crond cronie /usr/ cronie /usr/bin/ cronie /usr/bin/anacron cronie /usr/bin/crond cronie /usr/bin/crontab cronie /usr/lib/ cronie /usr/lib/systemd/ cronie /usr/lib/systemd/system/ cronie /usr/lib/systemd/system/cronie.service cronie /usr/share/ cronie /usr/share/licenses/ cronie /usr/share/licenses/cronie/ cronie /usr/share/licenses/cronie/COPYING cronie /usr/share/man/ cronie /usr/share/man/man1/ cronie /usr/share/man/man1/crontab.1.gz cronie /usr/share/man/man5/ cronie /usr/share/man/man5/anacrontab.5.gz cronie /usr/share/man/man5/crontab.5.gz cronie /usr/share/man/man8/ cronie /usr/share/man/man8/anacron.8.gz cronie /usr/share/man/man8/cron.8.gz cronie /usr/share/man/man8/crond.8.gz cronie /var/ cronie /var/spool/ cronie /var/spool/anacron/ cronie /var/spool/cron/
从这个文件列表中,可以看到有三个可执行文件 /bin/anacron,/bin/crond,/bin/crontab
其中anacron和crond都能够做到以daemon的方式运行在后台,并且周期性地执行配置文件中指定的命令。至于二者的区别,请自行阅读各自的manual。
通过查看 /usr/lib/systemd/system/cronie.service ,发现里面用到的是 crond。至于crond会读取哪些配置文件,请自行阅读crond的manual。
第三个可执行文件 crontab 是用于维护配置文件的。
crond通过两种方式监测配置文件的改动,一种是使用inotify的方式,另一种是每分钟检查配置文件的modtime,这两种方式都不需要你在修改了配置文件之后手动重启 crond。
archlinux的wiki上说不应该直接编辑配置文件,应该使用crontab这个命令进行操作。
基本的crontab命令:
#列出当前用户的配置文件 crontab -l #编辑当前用户的配置文件 crontab -e #删除当前用户的配置文件 crontab -r
crontab 的详细用法可以参考 man crontab
经过测试发现,当编辑完当前用户的配置文件然后保存之后,实际上是在 /var/spool/cron/ 这个目录下多了一个以用户名作为文件名的文件。
有一个地方挺奇怪的,/var/spool/cron/ 这个目录的权限是 755,属于root用户和root组,我用非root的用户执行 crontab 命令竟然能在改目录下增删文件。
20160412 加:不奇怪了,原因找到了,是因为 /bin/crontab 拥有 setuid 的权限,而/bin/crontab 的所有者是 root,所以当我以非root用户执行 crontab 命令的时候,我就临时成为了root。
我们在这里不使用 crontab 来修改 /var/spool/cron/ 中的文件,我们直接将配置文件放到 /etc/cron.d/ 这个目录中。
来一个小示例:
sudo vim /etc/cron.d/mycrontab
文件的内容填入(该配置的意思是 每分钟以 root 用户的身份执行一次 touch /tmp/testfile 这条命令):
* * * * * root touch /tmp/testfile
然后保存。
启动 crond 的 daemon:
sudo systemctl start conie.service
看看是不是 /tmp/testfile 这个文件被建立了,然后访问时间每分钟都改变。
对于配置文件的具体应该如何编写,可以查看 man 5 crontab。