大家好,提前谢谢大家。
我在 mysql 用户 crontab 中编写了一个作业,但它根本没有运行。我认为我的代码是正确的,因为如果我执行它并指向我用户的 crontab 中的脚本,它就可以正常工作:
00 12 * * * /usr/bin/mariadb-dump -u root -pMyPassword --lock-tables -A > /full/path/"`date +"%Y-%m-%d"`".sql && rm /full/path/"`date -d '-2 days' '+%Y-%m-%d'`".sql
但是当我从mysql用户的crontab指向它时,它不起作用:
00 12 * * * /full/path/to/script
我也尝试过直接运行它并转义 % 符号,但这也无济于事。
我尝试过在指定和不指定源的情况下运行脚本,尽管我不确定这样做会有什么帮助:
#!/bin/bash
source /full/path/to/my/user/.zshrc
00 12 * * * /usr/bin/mariadb-dump -u root -pMyPassword --lock-tables -A > /full/path/"`date +"%Y-%m-%d"`".sql && rm /full/path/"`date -d '-2 days' '+%Y-%m-%d'`".sql
我还在 crontab 的底部添加了一个额外的空白行。但这没有帮助,而且日志也没有告诉我太多信息。
我也尝试过更改文件夹及其内容的权限。现在,它在 775 上,我已将 mysql 用户添加到组中,但仍然不起作用。
您知道我的设置可能存在什么问题吗?
答案1
通常cron
不能很好地处理&
和其他符号,所以你能做的最好的就是创建类似的脚本。还可以考虑在任何地方使用绝对路径:
#!/bin/bash
source /your/home/directory/.bash_profile
/path/to/mariadb-dump -u root -pMyPassword --lock-tables -A > /path/to/desired/path/"`date +"%Y-%m-%d"`".sql && rm /path/to/desired/path/"`date -d '-2 days' '+%Y-%m-%d'`".sql
并从以下位置运行它cron
:
* 12 * * * /path/to/script
不要忘记使此脚本可执行。每分钟运行一次也不是明智的做法。也许你想每天运行一次:
0 12 * * * /path/to/script
如果您的密码中包含特殊符号,请尝试创建文件~/.my.cnf
并在其中添加以下内容:
[client]
# The following password is sent to all standard MySQL clients
password="my password"
然后在命令行中保留而无需-p
输入密码
答案2
- 您需要
%
使用反斜杠转义符号\
。这就是它无法按预期运行命令的原因。 - 使用绝对路径代替 可能是一个好主意
~/relative/paths
。 * 12 * * *
每小时的每一分钟运行命令12
;请修改。- 不要在命令行上输入密码,因为密码会被记录,而且在命令运行时每个用户都可以看到它。