场景
在系统服务中注册服务,通过系统服务启动的应用,不能获取已经全局设置的环境变量。
已经尝试在以下位置设置了环境变量, HOME_PATH=’/home/path’:
/etc/profile
~/.bash_profile
~/.bashrc
但是,注册的系统服务(service)中的以下命令:
# Start main service
ExecStart=HOME_PATH/manage.py runs start
对应的service service_name start 启动的应用中却获取不了该环境变量(os.getenv(‘HOME_PATH’)返回为None)。
但是在bash中直接运行HOME_PATH/manage.py runs start
却可以正常获取到环境变量(os.getenv(‘HOME_PATH’)返回正确)。
解决办法
[Service]
User=root
Group=root
Environment="HOME_PATH=/home/path"
在此系统服务的配置中增加需要的环境变量Environment="HOME_PATH=/home/path"
未清楚的问题
2020年4月21日,
找到原因,来自于:https://blog.csdn.net/mmoooodd/article/details/17263923
为什么注册的系统服务不能获取到全局的环境变量?
普通Shell脚本在终端下运行时,环境变量来自于
init/profile/.bash_profile
等,就是在当前终端下可以得到的环境,比如PATH。
在service模式下,脚本运行在受限的环境中: 比如
service tomcat restart
等同于
env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "/etc/init.d/tomcat" restart
其中: env -i表示清空当前环境变量,然后带入后面的LANG,PATH,TERM
而PATH变量来自于/etc/init.d/functions
:
PATH="/sbin:/usr/sbin:/bin:/usr/bin"
所以,当把一个shell脚本放入到service中时,需要设定好PATH等环境。