如何为systemd服务的进程加载环境变量?
我正在开发一些服务脚本,需要在Raspbian(Jessie)上启动时执行,并且我决定使用systemd。我刚开始阅读一些关于如何使用它的快速教程,但是我遇到了环境方面的问题。如何为systemd服务的进程加载环境变量?
所执行的过程需要(在他们的代码),我在一个shell脚本设置一些环境变量,但他们不加载,尽管使用的EnvironmentFile = /路径/要/我的/文件...我有一个服务执行一个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
感谢您抽出宝贵的时间和歉意为我的英语不好!
PS:请让我知道如果你需要更多的信息
环境可以在如下systemd服务文件中设置下Exec选
Environment=LD_LIBRARY_PATH=/usr/lib
下面是systemd环境的官方文档/ EnvironmentFile使用
环境=
设置环境VA用于执行过程的riables。采用空格分隔的变量赋值列表。此选项可能会多次指定,在这种情况下,所有列出的变量都将被设置。如果同一个变量设置了两次,后面的设置将覆盖较早的设置。如果将空字符串分配给此选项,则重置环境变量列表,所有之前的分配都不起作用。变量扩展不在字符串内部执行,但是,扩展名是可能的。 $字符没有特殊含义。如果需要分配包含值空格或等号给一个变量,用双引号(“)表示分配
例:
环境=” VAR1 = WORD1 WORD2" VAR2 = WORD3“VAR3 = $ word 5 6“ 给出了具有值”word1 word2“,”word3“,”$ word 5 6“的三个变量”VAR1“,”VAR2“,”VAR3“
查看environ(7)有关环境变量的详细信息。
EnvironmentFile =
与Environment =类似,但是从文本文件读取环境变量。文本文件应该包含以换行分隔的变量赋值。空行,没有“=”分隔符的行,或者以行开头的行;或#将被忽略,这可以用于评论。以反斜杠结尾的行将与下一行连接,允许多行变量定义。除非你使用双引号(“),除非你使用双引号(”),否则解析器会剥去开始和结尾的空格。
传递的参数应该是绝对文件名或通配符表达式,可选地以“ - ”作为前缀,文件不存在,它不会被读取,也不会记录任何错误或警告消息。该选项可以多次指定,在这种情况下,将读取所有指定的文件。如果将空字符串分配给此选项,则文件列表读取被重置,所有先前的分配都不起作用
在执行该过程之前不久,将读取此指令列出的文件(更具体地说,在之前的单元状态的所有过程都已终止之后,这意味着您可以生成这些文件在一个单元状态,并在下一个选项中读取它)。
这些文件的设置将覆盖使用Environment =进行的设置。如果从这些文件中设置两次相同的变量,则文件将按照它们指定的顺序读取,而后面的设置将覆盖较早的设置。
更多here
谢谢,我其实是红的,但也许有点太快哈哈!我认为环境文件必须是导出变量的bash脚本文件...我通过更正语法来使其工作 – ozonePowered
万一检查出[不死](https://immortal.run/post/run.yml/) – nbari
事实上,DarkKnight的回答让我明白我错过了。 无论如何谢谢你的建议,我会看看,看看它的功能可能是有用的! – ozonePowered