cron 中的脚本找不到命令

An *_*ser 6 cron ubuntu shell-script openstack

我有一个脚本可以转储数据库并将 SQL 文件上传到 Swift。我遇到了脚本在终端中运行良好但在 cron 中失败的问题。

稍微调试了一下,/usr/local/bin/swift发现脚本中没有找到该命令。

这是我的 crontab 条目:

*/2 * * * * . /etc/profile; bash /var/lib/postgresql/scripts/backup  
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的:

  1. 使用完整路径swift作为/usr/local/bin/swift
  2. 执行/etc/profile执行bash脚本之前脚本。

我该如何解决这个问题?

jes*_*e_b 10

Cron 不会在与用户相同的环境中运行。如果您执行以下操作,您将明白我的意思:

键入env从终端的提示,并记下输出。

然后像这样设置一个 cron 作业并将它的输出与之前的输出进行比较:

*/5 * * * * env > ~/output.txt 
Run Code Online (Sandbox Code Playgroud)

您会发现问题很可能是因为与您的用户crontab没有相同的PATH变量。作为解决方案,您可以(来自您的 postgres 用户)echo $PATH然后将结果复制到您的 crontab 的第一行(类似这样)

PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/jbutryn/.local/bin:/home/jbutryn/bin
Run Code Online (Sandbox Code Playgroud)

或者,如果您想更具体,您可以简单地添加以下内容:

PATH=$PATH:/usr/local/bin
Run Code Online (Sandbox Code Playgroud)

但是,我通常总是将用户的 PATH 放在 crontab 中,因为我还没有听到不这样做的充分理由,如果不这样做,您可能会再次遇到此问题。