如何为systemd服务的进程加载环境变量?
How to load environment variables for the process of a systemd service?
我正在开发一些需要在 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
感谢您抽出宝贵时间,抱歉我的英语不好!
PS:如果您需要更多信息,请告诉我
环境可以在systemd服务文件中设置,如下Exec选项
Environment=LD_LIBRARY_PATH=/usr/lib
下面是systemd的官方文档Environment/EnvironmentFile用法
环境=
为执行的进程设置环境变量。采用 space 分隔的变量赋值列表。可以多次指定此选项,在这种情况下将设置所有列出的变量。如果同一个变量设置了两次,后面的设置会覆盖前面的设置。如果将空字符串分配给此选项,则会重置环境变量列表,所有先前的分配均无效。变量扩展不在字符串内部执行,但是,说明符扩展是可能的。 $ 字符没有特殊含义。如果您需要将包含 space 或等号的值分配给变量,请使用双引号 (") 进行赋值。
示例:
环境="VAR1=word1 word2" VAR2=word3 "VAR3=$word 5 6"
给出三个变量 "VAR1"、"VAR2"、"VAR3",其值为 "word1 word2"、"word3"、"$word 5 6".
有关环境变量的详细信息,请参阅 environ(7)。
环境文件=
类似于 Environment= 但从文本文件中读取环境变量。文本文件应包含以换行符分隔的变量赋值。空行、没有“=”分隔符的行或以 ; 开头的行或 # 将被忽略,可用于注释。以反斜杠结尾的行将与下一行连接,允许多行变量定义。除非您使用双引号 (").
,否则解析器会从赋值值中去除前导和尾随的白色 space
传递的参数应该是一个绝对文件名或通配符表达式,可以选择使用“-”作为前缀,这表示如果文件不存在,则不会读取它并且不会记录任何错误或警告消息。可以多次指定此选项,在这种情况下,将读取所有指定的文件。如果将空字符串分配给此选项,将重置要读取的文件列表,之前的所有分配均无效。
这个指令列出的文件将在进程执行前不久被读取(更具体地说,在前一个单元状态的所有进程终止之后。这意味着你可以在一个单元状态下生成这些文件,并用这个选项在下一个)。
这些文件中的设置会覆盖使用 Environment= 所做的设置。如果从这些文件中设置了两次相同的变量,文件将按照指定的顺序读取,后面的设置将覆盖前面的设置。
阅读更多here
我正在开发一些需要在 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
感谢您抽出宝贵时间,抱歉我的英语不好!
PS:如果您需要更多信息,请告诉我
环境可以在systemd服务文件中设置,如下Exec选项
Environment=LD_LIBRARY_PATH=/usr/lib
下面是systemd的官方文档Environment/EnvironmentFile用法
环境=
为执行的进程设置环境变量。采用 space 分隔的变量赋值列表。可以多次指定此选项,在这种情况下将设置所有列出的变量。如果同一个变量设置了两次,后面的设置会覆盖前面的设置。如果将空字符串分配给此选项,则会重置环境变量列表,所有先前的分配均无效。变量扩展不在字符串内部执行,但是,说明符扩展是可能的。 $ 字符没有特殊含义。如果您需要将包含 space 或等号的值分配给变量,请使用双引号 (") 进行赋值。
示例:
环境="VAR1=word1 word2" VAR2=word3 "VAR3=$word 5 6" 给出三个变量 "VAR1"、"VAR2"、"VAR3",其值为 "word1 word2"、"word3"、"$word 5 6".
有关环境变量的详细信息,请参阅 environ(7)。
环境文件=
类似于 Environment= 但从文本文件中读取环境变量。文本文件应包含以换行符分隔的变量赋值。空行、没有“=”分隔符的行或以 ; 开头的行或 # 将被忽略,可用于注释。以反斜杠结尾的行将与下一行连接,允许多行变量定义。除非您使用双引号 (").
,否则解析器会从赋值值中去除前导和尾随的白色 space传递的参数应该是一个绝对文件名或通配符表达式,可以选择使用“-”作为前缀,这表示如果文件不存在,则不会读取它并且不会记录任何错误或警告消息。可以多次指定此选项,在这种情况下,将读取所有指定的文件。如果将空字符串分配给此选项,将重置要读取的文件列表,之前的所有分配均无效。
这个指令列出的文件将在进程执行前不久被读取(更具体地说,在前一个单元状态的所有进程终止之后。这意味着你可以在一个单元状态下生成这些文件,并用这个选项在下一个)。
这些文件中的设置会覆盖使用 Environment= 所做的设置。如果从这些文件中设置了两次相同的变量,文件将按照指定的顺序读取,后面的设置将覆盖前面的设置。
阅读更多here