现象
在 Linux 下通过 sudo 命令运行某些程序时,比如:
sudo -u zookeeper ./zkServer.sh start
报错:
Error: JAVA_HOME is not set and java could not be found in PATH.
在当前用户下执行:
echo $JAVA_HOME
/usr/lib/jvm/jdk22
显然是有的。
而且我们的环境变量是通过/etc/profile
或/etc/profile.d/java.sh
配置的,全局生效。按理说对于 sudo 命令模拟的用户应该也是存在的。
分析
产生这个问题的原因是 sudo 命令与 su 命令不同,用这个命令模拟用户并不会加载用户配置文件,且这个命令仅会继承有限的当前用户环境变量,而这其中并不包含 JAVA_HOME 和 PATH。
解决
修改 sudo 命令配置文件:
sudo visudo
在其中添加:
Defaults env_keep += "JAVA_HOME PATH"
这样就可以让 sudo 命令继承当前用户的环境变量 JAVA_HOME 和 PATH。
测试:
sudo -u zookeeper bash -c 'echo $JAVA_HOME'
/usr/lib/jvm/jdk22
文章评论