Systemd bash 内置函数

Tom*_*Tom 5 bash source environment-variables systemd

我有一个应用程序需要使用 commando 源来设置他的环境文件。

[Unit]
Description=Programname
After=syslog.target network.target

[Service]
User=root
ExecStartPre=source /opt/environmentname/bin/activate enviromentname
ExecStart=/var/programname/programname -f /etc/programname/programconfig.conf

[Install]
WantedBy=multi-user.target  
Run Code Online (Sandbox Code Playgroud)

现在,Systemd 抱怨 source 因为这不是绝对路径而且 source 是 bash 的内置所以我试过了

ExecStartPre=/bin/bash -c "source /opt/environmentname/bin/activate enviromentname"
Run Code Online (Sandbox Code Playgroud)

我们使用 source 而不是 chmod +x 运行脚本是因为供应商的要求。

那么有没有办法让这个工作?或者我们需要使用分叉之类的东西吗?

我们如何在 Systemd 单元文件中正确使用 bash 内置函数?

meu*_*euh 5

您应该能够执行多行脚本,例如

ExecStart=/bin/bash -c '\
   source /opt/environmentname/bin/activate environmentname; \
   exec /var/programname/programname -f /etc/programname/programconfig.conf'
Run Code Online (Sandbox Code Playgroud)


ori*_*ion 2

要理解这一点...是否ExecStart取决于该命令设置的环境?因为这些行实际上不是在同一个 shell 中执行的,所以你不能指望它们共享环境。Environment您需要的是在单元文件中使用关键字。这样,ExecStart将获得您的文件定义的环境。

https://coreos.com/os/docs/latest/using-environment-variables-in-systemd-units.html

  • 适合您情况的相关线程:https://lists.freedesktop.org/archives/systemd-devel/2012-October/007273.html 但也许您最好生成环境,设置它,然后运行您的程序在同一行中(运行不止一件事的长 bash 行) (2认同)