如何为systemd服务的进程加载环境变量?

8
我正在开发一些需要在Raspbian (Jessie)系统启动时执行的服务脚本,并决定使用systemd。我刚开始阅读一些快速教程,但是我在环境设置方面遇到了问题。运行的进程需要(在它们的代码中)一些环境变量,我将其设置在一个shell脚本中,但它们没有被加载,尽管使用了EnvironmentFile = /path/to/my/file... 我有一个用于执行Python3脚本的服务以及另一个用于Node.js应用程序的服务。我已经寻找替代解决方案一整天了,但似乎没有什么作用...也许我只是没有理解systemd的工作原理?这一定是可行的,因此我向您请教...
以下是我的单元文件:
对于Python脚本:
[Unit]
Description=My awesome python script
After=multi-user.target

[Service]
ExecStart=/usr/local/bin/python3.6 /home/pi/Desktop/myawesomescript.py
Restart=Always
RestartSec=5
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=mypython
User=pi
EnvironmentFile=/home/pi/.bash_vars

[Install]
WantedBy=multi-user.target

节点应用程序:
[Unit]
Description=My awesome Node.js socket.io app
Requires=After=mypython.service    # Requires the python script to be running

[Service]
ExecStart=/usr/bin/node /home/pi/Desktop/myawesomenodeapp/src/index.js
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=mynodeapp
User=pi
EnvironmentFile=/home/pi/.bash_vars

[Install]
WantedBy=multi-user.target

感谢您抽出时间阅读此文,并对我的英语表达道歉!

附注:如果需要更多信息,请告诉我。


以防万一,查看 immortal - nbari
实际上,DarkKnight的回答帮助我理解了我错过的东西。无论如何,还是谢谢你的建议,我会看一下并确定它的功能是否有用! - zovakk
1个回答

7

在systemd服务文件的Exec选项下,可以设置环境变量,如下所示:

Environment=LD_LIBRARY_PATH=/usr/lib

以下是systemd环境变量/环境文件用法的官方文档。
Environment=
为执行的进程设置环境变量。接受一个以空格分隔的变量赋值列表。此选项可以多次指定,在这种情况下,将设置所有列出的变量。如果同一个变量被设置两次,则后面的设置将覆盖前面的设置。如果将空字符串分配给此选项,则环境变量列表将重置,所有先前的赋值都没有效果。不在字符串内执行变量扩展,但是可以进行说明符扩展。$字符没有特殊含义。如果需要将包含空格或等号的值分配给变量,请使用双引号(“)进行赋值。
示例:
Environment="VAR1=word1 word2" VAR2=word3 "VAR3=$word 5 6"
给出三个变量“VAR1”,“VAR2”和“VAR3”,分别具有值“word1 word2”,“word3”和“$word 5 6”。
有关环境变量的详细信息,请参见environ(7)。
EnvironmentFile=
类似于Environment=,但从文本文件中读取环境变量。文本文件应包含以换行符分隔的变量赋值。空行、没有“=”分隔符的行或以;或#开头的行将被忽略,可用于注释。以反斜杠结尾的行将与下一行连接,允许多行变量定义。解析器会从分配值的前后删除前导和尾随空格,除非使用双引号(")。
传递的参数应为绝对文件名或通配符表达式,可选择加前缀“-”,表示如果文件不存在,则不会读取任何错误或警告消息。可以多次指定此选项,在这种情况下,将读取所有指定的文件。如果将空字符串分配给此选项,则重置要读取的文件列表,所有先前的分配均无效。
使用此指令列出的文件将在进程执行之前不久读取(更具体地说,在来自上一个单元状态的所有进程终止之后)。这意味着您可以在一个单元状态中生成这些文件,并在下一个选项中使用此选项进行读取。
这些文件中的设置会覆盖使用Environment=进行的设置。如果从这些文件中两次设置相同的变量,则按指定顺序读取文件,并且后面的设置将覆盖先前的设置。

阅读更多这里


1
谢谢,我确实读了这个,但可能有点太快了哈哈!我以为环境文件必须是一个导出变量的bash脚本文件...通过纠正语法,我让它工作了。 - zovakk
1
我实际上仍在寻找一种方法,可以从标准shell脚本中获取环境变量,以供几个systemd服务使用。 - Pierre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接