计划任务定义
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρνο),原意是时间。通常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。[摘自百度百科]
切换账号的原因
笔者在一个项目中使用的php的laravel框架。但在用root执行计划任务生成时报错,错误信息写入到了框架默认的文件中storage/log/laravel.log去,文件的权限变成了root。
当应用程序运行程序再有错误或者日志信息需要记录时候,导致无权访问storage/log/laravel.log,出现更多的错误。
于是我决定把计划任务迁移到www的账号下。一改动带了坑中坑。【ps:不是系统管理员,只是临时替代下】
下面是我做演示的例子情景再现
计划任务
* * * * * /usr/bin/php /tmp/testcron.php
怎么操作呢
crontab -e -u www
-e 代表编辑
-u 代表某个用户
-l 列出某个账号的计划任务
三下五除二的迁移完成,迁移到了www的账号下。
问题出现
过了两天业务人员说数据不正确,我想最近只调整了crontab呀。
于是猜想是出问题了,经同事指点才知道计划任务也有日志。
查看日志报错信息
zhangjuntaohost CROND[17732]: (www) CMD (/usr/bin/php /tmp/testcron.php)
zhangjuntaohost CROND[17712]: (CRON) ERROR chdir failed (/home/www): No such file or directory
原来是下面的原因导致,无家目录,
www:x:1002:1002::/home/www:/sbin/nologin
建立 /home/www ,如果要有切换目录等命令要让账号可登录
www:x:1002:1002::/home/www:/bin/bash
再看日志,正常了
zhangjuntaohost CROND[16807]: (www) CMD (/usr/bin/php /tmp/testcron.php)
zhangjuntaohost CROND[16814]: (www) CMD (/usr/bin/php /tmp/testcron.php)
删除/var/log/cron[坑中坑]
在演示上述例子中,看着计划任务的日志不顺眼,删除了。但后来运行下面的命令
tail -f /var/log/cron
一直提示没有文件,没有日志了。 我重新 touch 了一个 /var/log/cron 还是不行。
又从网上搜索下重启日志服务
service rsyslog restart
service crond restart
结束语
这次的改动,害得我跑了好几天的数据。
服务器的修改下,一定要详细的想想哪里会受到影响,权限,文件等。