在Linux系统中,通过systemd或init.d创建的服务有时无法获取到系统环境变量,这可能导致服务启动失败或运行异常。
编辑你的service文件(通常在/etc/systemd/system/
目录下):
[Service]
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Environment="MY_VAR=my_value"
或者从文件加载环境变量:
[Service]
EnvironmentFile=/etc/environment
EnvironmentFile=/path/to/your/env/file
systemctl edit
命令sudo systemctl edit your-service-name
然后添加环境变量配置:
[Service]
Environment="MY_VAR=my_value"
在脚本开头显式加载环境变量:
#!/bin/sh
### BEGIN INIT INFO
# ... 其他元数据 ...
# 加载系统环境变量
. /etc/environment
. /etc/default/your-service
# 或者直接设置
export MY_VAR=my_value
修改pam配置(适用于通过登录shell启动的服务):
编辑/etc/pam.d/systemd-user
,添加:
session required pam_env.so readenv=1 user_readenv=1
创建环境文件:
在/etc/systemd/system.conf
或/etc/systemd/user.conf
中设置:
DefaultEnvironment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
检查服务实际运行时的环境:
sudo systemctl show your-service-name --property=Environment
查看服务日志:
sudo journalctl -u your-service-name -b
测试环境变量是否被加载:
sudo systemd-run --pty -u test-service env
Environment
指令EnvironmentFile
修改service文件后需要重新加载:
sudo systemctl daemon-reload
sudo systemctl restart your-service
确保环境变量文件有正确的权限(通常为644)
如果使用EnvironmentFile
,文件中的变量应该以VAR=value
格式,不需要export