由于最近需要用到宝塔的计划任务来实现网站的自动备份,但是添加任务后发现并没有如期执行.
搜索了一番后在官方论坛发现了这篇帖子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文件