我有一个脚本可以转储数据库并将 SQL 文件上传到 Swift。我遇到了脚本在终端中运行良好但在 cron 中失败的问题。
经过一番调试,我发现/usr/local/bin/swift
脚本中找不到该命令。
这是我的 crontab 条目:
*/2 * * * * . /etc/profile; bash /var/lib/postgresql/scripts/backup
这是我尝试过的:
swift
使用as的完整路径/usr/local/bin/swift
/etc/profile
在执行 bash 脚本之前 执行脚本。
我该如何解决这个问题?
答案1
Cron 不会在与用户相同的环境中运行。如果您执行以下操作,您就会明白我的意思:
从终端提示符中键入env
并记下输出。
然后像这样设置一个 cron 作业并将其输出与之前的进行比较:
*/5 * * * * env > ~/output.txt
您会发现问题很可能是因为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
或者,如果您想更具体,您可以简单地添加以下内容:
PATH=$PATH:/usr/local/bin
不过,我通常总是将用户的 PATH 放入 crontab 中,因为我还没有听到不这样做的充分理由,如果不这样做,您可能会再次遇到此问题。
答案2
你做了最常见的一种计划任务错误。如果您使用特定环境,请将路径添加到 $PATH:
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/usr/sbin:/usr/bin:/script
export PATH
另请检查您的 cron 日志(/var/log/cron 或 /var/log/syslog)。并检查用户对二进制文件的权限。