Running jar with cron throws error: '/bin/sh: 1: java: not found'

Running jar with cron throws error: '/bin/sh: 1: java: not found'

我已使用以下命令将我的工作安排在每天 12:30 运行:

30 12 * * * java -jar test.jar

它抛出错误:

/bin/sh: 1: java: not found

我尝试 运行 这个命令:来自 shell 的 java -jar test.jar,它工作得很好。

现在我不明白了。我会说这是因为未设置 JAVA_HOME 环境变量,但为什么它从 shell 开始工作?

错误告诉您 shell 找不到要执行的 java 二进制文件。这与 JAVA_HOME 环境变量无关,但与 sh 查询以查找任何命令的 PATH 变量有关。

当您 运行 来自 cron 的任务时,shell 没有收到与命令为您工作的交互式 shell 相同的初始化。您同样会发现那里也没有设置 JAVA_HOME

您的登录 shell 环境与您的 cronjob 不同。使用 env 打印您的环境。

检查两者的路径 - 在 cron 内(类似的东西) 30 08 * * * env > ~/cronenv。 在您的登录 shell 中,只需使用 env。然后比较 PATH 变量。 正如@Marko Topolnik 已经指出的那样,您在 cron 中的 PATH 显然不包含您的 java 可执行文件。

您可以在包含所需路径的 crontab 文件中添加一行:

# m h  dom mon dow   command
PATH=.....

您可能需要这样的东西:

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

您还可以使用 echo $PATH 来找出您在常规环境中拥有的内容,并简单地使用该值。

我尝试的另一个选项是使用 java 安装的路径。

  1. 确保 java 使用以下命令安装

java -version

  1. 检查 java 安装的路径

whereis java

  1. 提供 运行 应用的完整路径

30 12 * * * /path_from_prev_step/java -jar test.jar

如果服务器安装了旧版本,这还允许您运行使用不同 java 便携版本的 jar。