【问题标题】:shell script not running via crontab, runs fine manuallyshell 脚本不通过 crontab 运行,手动运行良好
【发布时间】:2011-01-14 13:29:10
【问题描述】:

我已尝试导出路径和变量,但 crontab 仍然无法运行我的脚本。我确定我做错了什么。

我有一个运行 jar 文件的 shell 脚本。这无法正常工作。

阅读后,我读到这通常是由于 cron 通过其自己的 shell 实例运行导致路径不正确,因此没有与我的配置文件相同的首选项设置。

这是我的脚本经过几次修改后的样子:

#!/bin/bash --

. /root/.bash_profile

/usr/bin/java -jar Pharmagistics_auto.jar -o

...

这些是脚本中最重要的部分,其余部分直接基于 shell。

谁能告诉我我做错了什么?

【问题讨论】:

  • 为什么使用相对路径而不是绝对路径?
  • 可能更适合 serverfault 或超级用户
  • 对不起,我对我的 'nix 使用有点脱节。如何找出我的 java 可执行文件的绝对路径? 'whereis java' 不算数吗?我想你可能指的是我的 usr/bin/java 的错字。我已经纠正了这一点。如果这不是你的意思,请告诉我,我会解决它。
  • 是否可能是Pharmagistics_auto.jar的权限不允许cron守护进程执行?如果您执行 'chmod +x Pharmagistics_auto.jar' 然后尝试它会怎样?您也可以尝试使用“which java”来确定 java 从哪里运行。 “echo”是你在 shell 脚本中的朋友。希望对您有所帮助。
  • 我已经对有问题的 .jar 文件执行了“chmod +777 ...”,但仍然没有运气。哪个 java 输出了以下结果 '/usr/bin/java' 所以看起来我正在使用 write java 可执行文件。并且绝对同意,我已经抛出了一堆回声,这让我知道脚本中的所有命令都在工作,除了 java -jar 部分。我使用的命令是简单的“mv”或“find”命令。所以我不确定我在这里缺少什么

标签: linux shell cron crontab


【解决方案1】:

尝试指定 jar 文件的完整路径:

/usr/bin/java -jar /path/to/Pharmagistics_auto.jar -o

【讨论】:

  • 我只是在额头上拍了一下。很好,感谢丹尼斯解决问题的帮助。真的很感激!
【解决方案2】:

我只想告诉你你已经排除了什么:检查你的路径和环境。

既然你已经这样做了,那就开始调试吧。就像将检查点写入日志文件以查看脚本的执行程度(如果甚至启动),检查 cronjob 日志文件是否有错误,检查您的邮件(cron 发送错误邮件)等等......

不是很具体,抱歉。

【讨论】:

  • 我试过 MAILTO=myemail 但由于某种原因我一直没有收到任何电子邮件。我还检查了 cron 日志 /var/log/cron 并且它似乎正在执行脚本,而不是它的 java 部分。
【解决方案3】:

“导出我的路径和变量”将不起作用,因为 crontab 由不同的用户在不同的 shell 中运行。

另外,不确定这是否是您输入问题时的拼写错误,但我明白了:

usr/bin/java

...我不禁注意到您没有指定完全限定的路径。它正在当前工作目录中寻找一个名为“usr”的目录。对于 crontab,cwd 经常是未定义的,因此您的参考无处可去。

尝试从根目录指定完整路径,如下所示:

/usr/bin/java

或者,如果您想查看实际的相对路径示例,您也可以尝试:

cd /

usr/bin/java

【讨论】:

    【解决方案4】:

    一些想法。

    1. 删除#!/bin/bash 后面的--
    2. 确保将 cron 看到的脚本输出定向到邮件或您可以查看它的其他地方(例如 MAILTO=desiredUser)
    3. 确认您的脚本正在运行且未被其他长时间运行的脚本阻止(例如,在第二行添加touch /tmp/MY_SCRIPT_RAN && exit)
    4. 在知道脚本实际运行后,使用 set -x 和 set -v 调试脚本

    【讨论】:

    • 1.我已经删除了 --,请注意我也尝试添加 -l 无济于事。 2. MAILTO 出于某种原因没有向我发送任何电子邮件,我不知道为什么会这样。我在我的实际 cronjob 文本之前添加了 MAILTO=my@email.com,当我运行 crontab cron.txt 时,它被消化得很好,但仍然没有电子邮件。 3. 我的脚本正在运行,它正在执行 shell 命令就好了,只是 java 部分没有执行,但没有给我任何错误。 4. 你在这里是什么意思?在我有疑问的代码部分之前和之后设置一些东西?
    • @astro - RE #2 - 将其设置为本地计算机上的用户帐户,RE #3 - 感谢您的澄清。 RE #4 - 通过将set -x 命令添加到脚本中,bash 将显示它正在执行的内容。 set -v 提供有关命令评估和扩展的更多信息。
    • 2.不幸的是,不确定是否已为此框设置了电子邮件。 4. 我将 set -v 添加到脚本中,但仍然没有运气。我一无所获。我已将脚本更改为以下 /usr/bin/java -jar Pharmigistics.jar -o > javalog.txt 并且 javalog 始终为空。我在任何地方都没有看到任何错误消息,/var/log/cron 告诉我它正在执行我的脚本,我的脚本的一部分根本什么都不做。
    【解决方案5】:

    您是否在您的个人 .profile(或其他脚本)中定义了必要的路径和环境变量?您是否尝试过获取该特定文件(或者您已经使用 /root/.bash_profile 进行了哪些操作?)

    问这个问题的另一种方式是:你确定你期望的任何必要的路径和环境变量实际上都是可用的吗?

    如果没有其他问题,您是否尝试过回显单个值或仅在脚本中使用“env”命令然后查看标准输出?

    【讨论】:

    • 我相信我正在使用 '. /root/.bash_profile' 命令。我不确定,但我已经运行了一个 cronjob 并执行了一个 env > conEnv.txt 文件,然后将结果与我自己的 env 命令结果进行了比较。结果显然是非常不同的导出路径等。然后我尝试添加以下内容而不是 '. /root/.bash_profile' 部分:PATH=...[我的环境从使用我的用户配置文件运行 env 的结果复制/粘贴]..;导出路径;这也不起作用。
    【解决方案6】:

    提供您的 jar 文件的完整路径,以及您在哪个用户中运行 crontab?如果你为普通用户设置,你认为该用户有权限获取 root 的配置文件吗?

    【讨论】:

      猜你喜欢
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      相关资源
      最近更新 更多