为什么 cron 不运行其他用户的 crontab 中的命令?

为什么 cron 不运行其他用户的 crontab 中的命令?

大家好,提前谢谢大家。

我在 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;请修改。
  • 不要在命令行上输入密码,因为密码会被记录,而且在命令运行时每个用户都可以看到它。

相关内容