Posts tagged ‘cron’

在linux下,一般来说,想要自动定时运行命令,都会用到crontab。

它的语法也很简单明了:

10 1 * * * cd /path/to/script; sudo -u ms ./rec.sh >> rec.log 2>&1

10 */6 * * * cd /path/to/script; sudo -u ms ./rec.sh >> rec.log 2>&1

第一部分指定了执行的时间(分、小时、日、月、星期0-6),第二部分,指定了执行的命令。

上面第一个例子,是在凌晨1点10分,执行rec.sh命令,并输出log;第二个例子,是每隔6个小时执行一次命令,也就是0:10,6:10,12:10,18:10。

具体的编辑格式,请查看man 5 crontab (注意,不是man 1)

相关的命令:

crontab [-u user] file
crontab [-u user] [-l | -r | -e]

那么对于多用户的linux系统来说,怎样统一管理这些crontab呢?一个一个用户去查看,肯定太麻烦了。

猜想crontab应该是个编辑运行命令的客户端,那么它对应的服务器端是什么呢?查看man crontab可以看到其相关的命令式cron,再ps axu|grep cron,可以看到后台运行的cron进程。于是继续man cron,看到它会查看/var/spool/cron/crontabs  for  crontab  files!

这时,ls /var/spool/cron/crontabs,看到下面有几个以用户名命名的文件,里面就对应着各个用户的crontab内容了!这样就可以统一的管理多用户的crontab了!

有时,编辑了crontab,但是却不执行相应的命令,我遇到过两种不同的情况,会导致这个问题。

1、用户权限问题

If  the cron.allow file exists, then you must be listed therein in order to be allowed to use this command.  If

the cron.allow file does not exist but the cron.deny file does exist, then  you  must  not  be  listed  in  the

cron.deny  file  in  order  to use this command.  If neither of these files exists, only the super user will be

allowed to use this command.

也就是说,如果有cron.allow的话,仅其中列出的用户有执行crontab命令的权限;如果cron.allow不存在,而cron.deny存在的话,其中的用户没有执行权限;如果两者都没有,则仅root用户有执行权限。

2、cron daemon不读取crontab配置文件

这时,不管是crontab -e还是crontab filename貌似都没法使cron加载命令,那么只有kill掉cron进程,重启,然后就生效了!

查看是否成功执行crontab命令,一般可以通过搜索/var/log/message文件,例如:

tail -1000 /var/log/messages | grep rec.sh

如果有执行,但是没有达到想要的目的,那就要看看是否由于是环境配置的问题了!比如是否依赖.bash_profile等。