且听风吟
   静待花开

宝塔linux面板 计划任务不执行问题及解决办法

由于最近需要用到宝塔的计划任务来实现网站的自动备份,但是添加任务后发现并没有如期执行.

搜索了一番后在官方论坛发现了这篇帖子https://www.bt.cn/bbs/forum.php?mod=viewthread&tid=15674&highlight=CentOS
因安全问题博主也修改了root用户名,问题情况与帖子描述一致,但把用户名改回root显然不现实
郁闷的是帖子后续并没有给出其他的解决办法,所以只能自行研究了

经过分析与测试后发现可以通过修改宝塔的python脚本来解决,下面给出解决办法

宝塔面板的计划任务类脚本位于/www/server/panel/class/crontab.py,编辑它

第9行的import,我们需要引入一个新的模块pwd,修改如下

import public,db,os,web,time,re,pwd

接着搜索”def DelCrontab“,找到下列代码

x = web.ctx.session.server_os['x'];
if x == 'RHEL':
    file='/var/spool/cron/root'
else:
    file='/var/spool/cron/crontabs/root'

修改为

x = web.ctx.session.server_os['x'];
root_name = pwd.getpwuid(os.getuid())[0] if x == 'RHEL': file='/var/spool/cron/' + root_name else: file='/var/spool/cron/crontabs/' + root_name

继续搜索”def WriteShell“,找到如下代码

def WriteShell(self,config):
    x = web.ctx.session.server_os['x'];
    if x == 'RHEL':
        file='/var/spool/cron/root'
    else:
        file='/var/spool/cron/crontabs/root'


    if not os.path.exists(file): public.writeFile(file,'')
    conf = public.readFile(file)
    conf += config + "\n"
    if public.writeFile(file,conf):
        if x == 'RHEL':
            public.ExecShell("chmod 600 '" + file + "' && chown root.root " + file)
        else:
            public.ExecShell("chmod 600 '" + file + "' && chown root.crontab " + file)
        return True
    return public.returnMsg(False,'FILE_WRITE_ERR')

改为

def WriteShell(self,config):
    x = web.ctx.session.server_os['x'];
    root_name = pwd.getpwuid(os.getuid())[0]
    if x == 'RHEL':
        file='/var/spool/cron/' + root_name
    else:
        file='/var/spool/cron/crontabs/' + root_name


    if not os.path.exists(file): public.writeFile(file,'')
    conf = public.readFile(file)
    conf += config + "\n"
    if public.writeFile(file,conf):
        if x == 'RHEL':
            public.ExecShell("chmod 600 '" + file + "' && chown " + root_name + "." + root_name + " " + file)
        else:
            public.ExecShell("chmod 600 '" + file + "' && chown " + root_name + ".crontab " + file)
        return True
    return public.returnMsg(False,'FILE_WRITE_ERR')

保存所作修改.(编辑时注意缩进! )

执行”/etc/init.d/bt restart“重启宝塔面板.
大功告成!
需要强调的是:如果在修改前添加过计划任务,你可能需要删除后重新添加或者手动修改相关的cron文件

赞(10)
未经允许不得转载:β1ùe » 宝塔linux面板 计划任务不执行问题及解决办法

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址