问题:在Linux服务器上设置crontab定时任务执行laravel任务调度的时候,crontab -e 无法保存。会报错/var/spool/cron : Permission denied。
-
于是百度到是var/spool下的cron目录被用过了chattr命令 加了i或者i和a属性。具体可以查看chattr命令!
-
然后cd /var/spool 执行命令
lsattr ./cron
并没有什么反应,捣鼓半天发现只需要在/var/spool目录下执行
lsattr
即可。就会发现cron目录确实被加上了ia属性
----ia-------e-- ./cron
-
只需要执行如下命令即可。
chattr -ai /var/spool/cron
-
但是问题来了,这时候我这里又报错 bash: /usr/bin/chattr: Permission denied
-
再次去/usr/bin下查看chattr,发现该文件竟然也被加上了i属性。就等于自己给自己加了属性。使用chattr -i /usr/bin/chattr肯定是不可以的。于是再次百度。解决办法!!!
[root@c7 bin]# ls -lh chattr;lsattr chattr
-rw-r--r--. 1 root root 12K Jun 9 19:59 chattr
----i----------- chattr
[root@c7 bin]# cp chattr chattr.new
[root@c7 bin]# chmod a+x chattr.new
[root@c7 bin]# chattr.new -i chattr
[root@c7 bin]# rm -f chattr.new
[root@c7 bin]# chmod a+x chattr
[root@c7 bin]# ls -lh chattr;lsattr chattr
-rwxr-xr-x. 1 root root 12K Jun 9 19:59 chattr
---------------- chattr
-
然后再去/var/spool目录下把cron的a、i属性去掉即可编辑保存了。
搞定!这样就可以继续编辑crontab -e 的定时任务了。
附加几个小知识。
- laravel任务调度命令
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
/dev/null 2>&1 什么意思?
/dev/null将标准输出重定向到空设备,即我们常说的“黑洞”
2>表示错误输出
&表示等同的意思
1标准输出
2>&1就表示错误输出重定向等同于标准输出
所以>/dev/null 2>&1就表示将标准输出及错误输出全部重定向到“黑洞”,这么做可以有效的防止结果输出到控制台,以及inode节点被写满。
- 任务调度的时间设置
->cron('* * * * *'); 在自定义Cron调度上运行任务
->everyMinute(); 每分钟运行一次任务
->everyFiveMinutes(); 每五分钟运行一次任务
->everyTenMinutes(); 每十分钟运行一次任务
->everyFifteenMinutes(); 每十五分钟运行一次任务
->everyThirtyMinutes(); 每三十分钟运行一次任务
->hourly(); 每小时运行一次任务
->hourlyAt(17); 每小时第十七分钟运行一次任务
->daily(); 每天凌晨零点运行任务
->dailyAt('13:00'); 每天13:00运行任务
->twiceDaily(1, 13); 每天1:00 & 13:00运行任务
->weekly(); 每周运行一次任务
->monthly(); 每月运行一次任务
->monthlyOn(4, '15:00'); 每月4号15:00运行一次任务
->quarterly(); 每个季度运行一次
->yearly(); 每年运行一次
->timezone('America/New_York'); 设置时区
$schedule->call(function () {
})->weekly()->mondays()->at('13:00');
$schedule->command('foo')
->weekdays()
->hourly()
->timezone('America/Chicago')
->between('8:00', '17:00');
- crontab命令 链接!!
crontab -e
crontab -l
crontab -ri
service crond start
service crond stop
service crond restart
service crond reload
service crond status
关于crontab脚本不执行的问题
- crontab -e 编辑好以后,执行重新载入配置的命令。然后service crond status查看服务状态。如果没报错就没问题。
- 但是不报错也有可能不执行。记得去查看日志文件/var/log/cron。有时候也可以查看/var/spool/mail下的邮件,也会有报错信息。
- crontab运行要些绝对路径,而系统自动执行任务调度时,除了默认的环境,是不会加载任何其他环境变量的。crontab读取不到环境变量,将要执行的程序改成绝对路径就成功了。
比如*/1 * * * * cd /home/www/laravel && /usr/local/php7.3/bin/php artisan schedule:run >> /dev/null 2>&1 正确的配置
*/1 * * * * cd /home/www/laravel && php artisan schedule:run >> /dev/null 2>&1 错误的配置
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)