我正在尝试使用一个现成的 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'