2017-10-04 560 views
1

我正在开发一些服务脚本,需要在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:请让我知道如果你需要更多的信息

+0

万一检查出[不死](https://immortal.run/post/run.yml/) – nbari

+0

事实上,DarkKnight的回答让我明白我错过了。 无论如何谢谢你的建议,我会看看,看看它的功能可能是有用的! – ozonePowered

回答

0

环境可以在如下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

+0

谢谢,我其实是红的,但也许有点太快哈哈!我认为环境文件必须是导出变量的bash脚本文件...我通过更正语法来使其工作 – ozonePowered