前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >解决cron不执行的问题

解决cron不执行的问题

作者头像
全栈程序员站长
发布2022-07-08 12:42:39
1.4K0
发布2022-07-08 12:42:39
举报
文章被收录于专栏:全栈程序员必看

在FreeBSD5.4下面做开发,需要定期备份mysql数据,开始在网上找了bash的脚本,但是执行无效,一怒之下,使用php来写,嘿嘿,其实php写脚本也不错滴。备份其实就是把mysql的数据库文件复制出来,当然,也可以使用mysqldump之类的工具把结果生成sql语句,不过我为了方便,就直接复制文件,并且压缩一下。看php代码:

代码语言:javascript
复制
#!/usr/local/php/bin/php
<?
$date = "mysql_". date("Ymd_His");
$cmd = "sudo /usr/bin/tar -cf /home/heiyeluren/db_dump/".$date.".tgz /usr/local/mysql/var/";
system($cmd);
?>

把脚本保存到 /home/heiyeluren/db_dump/mysql_dump.php。 上面的代码很好理解吧,就是生成一个按照时间为名字的.tgz文件,保存在我的个人主目录下面,为了脚本能够执行,还要加上 chmod +x /home/heiyeluren/db_dump/mysql_dump.php ,让脚本能够有执行权限。我们自己先试验一次这个脚本,看有效没有: /home/heiyeluren/db_dump/mysql_dump.php 在看看有没有生成文件: ls /home/heiyeluren/db_dump/ 嗯,生成了 mysql_20051206_xxxxx.tgz的文件,证明有效果。

好,切换到root用户:su – root,输入密码,添加cron任务:

代码语言:javascript
复制
crontab -e

加入任务:

代码语言:javascript
复制
*/1 * * * * /usr/local/php/bin/php /home/heiyeluren/db_dump/mysql_dump.php > /dev/null

嘿嘿,设定了一分钟执行一次,设这么快,主要是看看有没有效果。

等了两分钟,看了一下,嗯?怎么在 /home/heiyeluren/db_dump/下面还是没有 .tgz 的文件?怎么回事呢?

代码语言:javascript
复制
查看cron的日志:

cat /var/log/cron

刷刷列了好几屏幕,看到类似这样的: Dec 6 19:32:00 BSD /usr/sbin/cron[12256]: (root) CMD (/usr/local/php/bin/php /home/heiyeluren/db_dump/mysql_dump.php > /dev/null)

证明我的脚本执行了。。。但是为什么没有效果呢? 哦,我想起来了,好像cron能够把脚本中的输出当作邮件发送给创建cron的用户,嗯,好,我们去掉 > /dev/null 这段,就让我们cron直接发送邮件给我们的root: crontab -e 修改为: */1 * * * * /usr/local/php/bin/php /home/heiyeluren/db_dump/mysql_dump.php 等了一会,看一下邮件,可以使用mail命令来看,也可以直接在 /var/spool/clientmqueue/ 下面看,我们选择第二种: ls /var/spool/clientmqueue/ 列出好多文件: dfjB6BG0SE012107 dfjB6BN0JP012185 dfjB6BU1mj012248 qfjB6BG0SE012107 qfjB6BN0JP012185 qfjB6BU1mj012248 dfjB6BH0aP012123 dfjB6BO1ID012192 dfjB6BV0dL012254 qfjB6BH0aP012123 qfjB6BO1ID012192 qfjB6BV0dL012254 我们打开一个来看: cat /var/spool/clientmqueue/dfjB6BG0SE012107 嗯,看到输出: sudo: not found ???难道是我们的php脚本有问题,不是我测试过没有问题的吗?哦,看提示,原来是sudo命令没有找到,为什么呢?因为所有脚本中引用的程序都必须是绝对路径滴,不然会找不到,唉,犯错了。

嗯,既然我是用root执行的,权限是没有问题滴,何不把sudo给删除呢,说干就干,修改脚本: vi /home/heiyeluren/db_dump/mysql_dump.php 修改为:

代码语言:javascript
复制
#!/usr/local/php/bin/php
<?
$date = "mysql_". date("Ymd_His");
$cmd = "/usr/bin/tar -cf /home/heiyeluren/db_dump/".$date.".tgz /usr/local/mysql/var/";
system($cmd);
?>

嘿嘿,去掉了sodu,嗯,保存退出,看看我们的crontab效果如何。。。

哈哈,一分钟过后,查看下目录: ls /home/heiyeluren/db_dump 嘿嘿,有两个 .tgz 的文件了:mysql_20051206_xxxx.tgz,嗯,证明成功了,但是不能总是让cron给root发邮件呀,不然一会功夫服务器空间就没有了,修改cron任务为: 0 6 * * * /usr/local/php/bin/php /home/heiyeluren/db_dump/mysql_dump.php > /dev/null 就是每天早上的六点执行一次,并且把任何输出到输出到 /dev/null 中,不要给root发邮件。

好,终于解决,不容易,涉及很多知识电,不过增长了经验,不是吗?

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/112344.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年11月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档