使用crontab遇到的一点问题,报错/var/spool/cron : Permission denied和bash: /usr/bin/chattr: Permission denied

问题:在Linux服务器上设置crontab定时任务执行laravel任务调度的时候,crontab -e 无法保存。会报错/var/spool/cron : Permission denied。

  1. 于是百度到是var/spool下的cron目录被用过了chattr命令 加了i或者i和a属性。具体可以查看chattr命令!

  2. 然后cd /var/spool 执行命令

    lsattr ./cron
    

    并没有什么反应,捣鼓半天发现只需要在/var/spool目录下执行

    lsattr
    

    即可。就会发现cron目录确实被加上了ia属性

    ----ia-------e-- ./cron
    
  3. 只需要执行如下命令即可。

    chattr -ai /var/spool/cron
    
  4. 但是问题来了,这时候我这里又报错 bash: /usr/bin/chattr: Permission denied

  5. 再次去/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
    
  6. 然后再去/var/spool目录下把cron的a、i属性去掉即可编辑保存了。
    搞定!这样就可以继续编辑crontab -e 的定时任务了。

    附加几个小知识。
    1. 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节点被写满。
    
    1. 任务调度的时间设置
    ->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');	每月415:00运行一次任务
    ->quarterly();	每个季度运行一次
    ->yearly();	每年运行一次
    ->timezone('America/New_York');	设置时区
    
    $schedule->call(function () {
        // 每周星期一13:00运行一次...
    })->weekly()->mondays()->at('13:00');
    
    // 工作日的上午8点到下午5点每小时运行...
    $schedule->command('foo')
             ->weekdays()
             ->hourly()
             ->timezone('America/Chicago')
             ->between('8:00', '17:00');
    
    
    1. crontab命令 链接!!
    crontab -e // 编辑
    crontab -l // 查看定时任务列表
    crontab -ri // 删除前给提示 去掉i直接就删了(一定谨慎使用!删完可就找不回来了!!!)
    service crond start //启动服务
    service crond stop //关闭服务
    service crond restart //重启服务
    service crond reload //重新载入配置
    service crond status // 查看crontab服务状态
    
关于crontab脚本不执行的问题
  1. crontab -e 编辑好以后,执行重新载入配置的命令。然后service crond status查看服务状态。如果没报错就没问题。
  2. 但是不报错也有可能不执行。记得去查看日志文件/var/log/cron。有时候也可以查看/var/spool/mail下的邮件,也会有报错信息。
  3. 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    错误的配置
    
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值