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 安装的路径。
- 确保 java 使用以下命令安装
java -version
- 检查 java 安装的路径
whereis java
- 提供 运行 应用的完整路径
30 12 * * * /path_from_prev_step/java -jar test.jar
如果服务器安装了旧版本,这还允许您运行使用不同 java 便携版本的 jar。
我已使用以下命令将我的工作安排在每天 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 安装的路径。
- 确保 java 使用以下命令安装
java -version
- 检查 java 安装的路径
whereis java
- 提供 运行 应用的完整路径
30 12 * * * /path_from_prev_step/java -jar test.jar
如果服务器安装了旧版本,这还允许您运行使用不同 java 便携版本的 jar。