说我有两个服务,它们是在系统(Ubuntu 16.04.3)启动时自动启动两个进程。
一份服务文件:
[Unit]
Description=service 1
Requires=init_mdc.service
After=rc.local.service init_mdc.service
[Service]
ExecStart=someCmd
ExecReload=someCmd
KillMode=process
Restart=on-failure
Type=simple
另一个服务文件:
[Unit]
Description=service 2
Requires=init_mdc.service
After=rc.local.service init_mdc.service
[Service]
ExecStart=someCmd2
ExecReload=someCmd2
KillMode=process
Restart=on-failure
Type=simple
这两个服务需要一些相同的环境变量。
目前我的解决方案还不好,因为someCmd
两个服务的s是两个不同的bash脚本,我在其中设置了相同的env变量。
我在想是否可以以某种方式在某个地方设置一些环境变量,以便两个服务可以共享它们,换句话说,我只想设置环境变量一次,而不是两次。
我尝试从/etc/profile
、 from导出这些环境变量/etc/rc.local
,但它们不起作用。我认为这是因为系统首先运行我的两个服务,然后/etc/profile
被/etc/rc.local
系统读取。
有没有一种方法可以让我为多个服务文件设置一些环境变量?我知道我们可以在服务文件中设置来导入一些环境变量,但我不喜欢这样,因为我仍然必须为每个服务EnvironmentFile=XXX
设置多次......EnvironmentFile=XXX
答案1
使用EnvironmentFile=
才是出路。
我不明白您关于必须多次设置它的观点...您必须从需要这些变量的每个服务中设置一次...
服务一:
[Unit]
Description=service 1
[Service]
ExecStart=someCmd
EnvironmentFile=/path/to/common.env
...
服务二:
[Unit]
Description=service 2
[Service]
ExecStart=someCmd2
EnvironmentFile=/path/to/common.env
...
并将所有VAR=VALUE
设置保存在文件中/path/to/common.env
。
环境文件的语法与 shell 脚本的语法兼容,因此您甚至可以在自己的环境中获取它.bash_profile
# ~/.bash_profile
if [ -f /path/to/common.env ]; then
. /path/to/common.env
fi
一种替代方法是在 PID 1 中使用systemctl set-environment
或systemctl import-environment
设置全局环境变量。(请参阅文档这里.)
您可能仍然需要PassEnvironment=
在特定服务中导出这些变量,但在这种情况下,您只需要列出变量名称。
我真的不认为这是最好的解决方案,我认为EnvironmentFile=
它更加独立、优雅并且适合您的用例。