1

所以我认为问题最有可能是路径。但我对如何正确设置它感到困惑。

所以我的脚本的顶部看起来像:

#!/bin/sh


MYSQL="$(which mysql)"
if [ -z "$MYSQL" ]; then
    echo "Error: MYSQL not found"
    exit 1
fi

当我在 ssh 中运行脚本时,它运行良好!但是当我设置 cron 时,在 directadmin 中使用这些命令:

/home/username/script.sh

也试过:

/bin/sh /home/username/script.sh

他们都给我以下错误:

Error: MYSQL not found

所以这是我在网上找到的:

SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin 
HOME=/var/log

我假设我需要在我的脚本中添加至少一个上述语句。该服务器是一个 freebsd 服务器,我假设一切都在默认位置。我知道当我执行 whereis sh 时它会返回 /bin/sh

我不知道如何检查 PATH 或 home。我是 freebsd 的新手,所以任何帮助都会很棒。

4

4 回答 4

1

Crontab 作业由系统提交,不执行正常的系统启动脚本(设置 PATH 和类似的东西)。

我在 Solaris 上的 Korn shell 中完成了所有工作,并在我所有脚本的开头添加了与这些类似的行:

#!/bin/ksh
#-------------------------------------------------------------------------------
# /opt/app/batch/daily_dns.ksh  Daily DNS Batch process via crontab
# 16 3 * * * /opt/app/batch/dns/bin/daily_dns.ksh > /opt/app/batch/daily_dns.log
#-------------------------------------------------------------------------------
. /etc/profile

你可能需要做类似的事情。

于 2013-02-17T17:56:49.747 回答
0

这是因为 PATH 问题。您可以根据上述答案在 crontab 文件中指定路径变量,也可以修改脚本。

如果您决定选择后者,这里是需要修改的内容,

  1. 在您的标准终端上,运行“ which which ”以找出系统上“which”工具的确切路径(通常为“ /usr/bin/which ”)
  2. 将脚本中的命令“which”替换为其完整路径。

现在您可以在 crontab 中使用 -“ /bin/sh /path/to/your/script ”来 cron 脚本。在这种情况下,您不需要在 crontab 文件中添加任何额外的路径变量。

希望这可以帮助。

于 2013-05-21T07:27:26.897 回答
0

您可以阅读 env(1) 联机帮助页并使用它来诊断和修复您的问题,或者如果您愿意,也可以从脚本中修复环境。

正如你提到的它是一个freebsd 服务器,我猜你在/usr/local 下安装了mysql - 它不包含在cron 的默认$PATH 中。

于 2013-02-18T16:12:54.817 回答
0

我只是做出有根据的猜测,因为我只熟悉 Debian,但 cron 以 root 身份运行任务并以非交互方式运行它们。这意味着它获得与您的 root 用户相同的路径,并且通常在设置路径之前从 .bash_profile 退出非交互式提示。

TL;DR:检查您的 root 用户是否具有 MYSQL 变量,并检查 root 用户的 .bash_profile 是否在非交互式提示下退出。

于 2013-02-17T17:56:09.013 回答