从 systemd 服务文件中的 sh 脚本设置环境变量

从 systemd 服务文件中的 sh 脚本设置环境变量

我正在尝试使用一个现成的 bash 脚本来设置 env。这是我正在尝试使用的服务:

[Unit]
Description=myserver service
After=multi-user.target

[Service]
Type=simple
User=ec2-user
Group=ec2-user
WorkingDirectory=/home/ec2-user/myserver/
ExecStart=/bin/sh -c '/home/ec2-user/myserver/config/myserverVars.sh ;/home/ec2-user/venv/bin/python  /home/ec2-user/myserver/myserver.py 2>&1 >> /home/ec2-user/myserver/logs/systemd_myserver.log' 
StandardOutput=append:/home/ec2-user/myserver/logs/systemd_stdout.log
StandardError=append:/home/ec2-user/myserver/logs/systemd_stderr.log

[Install]
WantedBy=multi-user.target

myserverVars.sh

#!/bin/bash
export [email protected]
export APP2_BIND_PASS=xxxxxx
export APP3=xxxxxx

中的变量/home/ec2-user/myserver/config/myserverVars.sh
从未设置,并且服务器在没有变量的情况下启动,这是错误的。我试图避免使用环境密钥或环境文件。

答案1

如果您希望脚本文件中定义的变量可供运行该脚本的父环境使用,则需要来源脚本,而不是执行它。将您的ExecStart行更改为:

ExecStart=/bin/sh -c '. /home/ec2-user/myserver/config/myserverVars.sh ;/home/ec2-user/venv/bin/python  /home/ec2-user/myserver/myserver.py >> /home/ec2-user/myserver/logs/systemd_myserver.log 2>&1 ' 

采购(“.”或“源”)和在 bash 中执行文件有什么区别?有关获取脚本和执行脚本之间差异的详细信息。

另请注意,我更改了重定向的顺序。要将 stderr 和 stdout 获取到同一个文件,您> file 2>&1不需要2>&1 > file.

答案2

对我来说这有效:

 ExecStart=/bin/bash -c 'MYVAR=xx exec /some/file'

相关内容