我在 .zshrc 中设置 JAVA_HOME:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre/
这对于交互式程序来说很好。但我有通过 cron 运行的 JVM 程序,它使用 Bourne shell。 bourne shell 程序不断给我这个:
groovy: JAVA_HOME is not defined correctly, can not execute: /usr/lib/jvm/default-java/bin/java
解决这个问题最巧妙的方法是什么?我不记得以前需要担心这个。目前,我在每个 crontab 条目上设置 JAVA_HOME,这是繁重且多余的。
答案1
假设您指的是您自己用户的 crontab,为了避免重复定义,JAVA_HOME
您可以使用(而不是)export
中的变量,即使在非交互式、非登录 shell 中也会读取该变量,并在您的 cron 作业中运行(替换, 基于如果合适的话,您的问题中称为“Bourne shell”的程序实际上是什么)。~/.zshenv
~/.zshrc
zsh -c 'sh /path/to/script'
sh
或者,如果您可以JAVA_HOME
在多个位置进行定义,并且您的sh
实现支持此1,则可以通过附加到脚本的 shebang 或将 cron 作业的命令更改为 1 来将export
其作为登录 shell~/.profile
进行调用。sh
-l
sh -l /path/to/script
不过,最后,最方便的解决方案可能是简单地添加
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre/
作为 crontab 顶部的一行(JAVA_HOME
当然,除非您有不同的 cron 作业需要不同的值)。
1 你的sh
,即不太可能一个“真正的”Bourne shell,-l
如果它实际上是(例如)bash
或dash
.作为斯蒂芬·查泽拉斯指出在一个评论, 1) 如果它是 Bourne shell 或 的实现,则没有它POSIXsh
(例如,在 {Free,Net,Open}BSD 上sh
没有选项); -l
2)并非所有支持的实现在给出该选项时-l
都会读取。~/.profile
答案2
您可以分别在两个系统范围的配置文件中进行设置/etc/bash.bashrc
(/etc/bashrc
在非 Debian 系统上)和/etc/zsh/zshenv
(/etc/zshenv
由于语法是一样的,直接复制粘贴即可
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre/
在两个文件中