Bash

從 systemd 服務文件中的 sh 腳本設置環境變數

  • March 30, 2022

我正在嘗試使用一個現成的 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 APP1=foo@gmail.com
export APP2_BIND_PASS=xxxxxx
export APP3=xxxxxx

中的變數/home/ec2-user/myserver/config/myserverVars.sh

從未設置,並且伺服器在沒有變數的情況下啟動,這是錯誤的。我試圖避免使用環境密鑰或環境文件。

如果您希望腳本文件中定義的變數可用於執行該腳本的父環境,您需要獲取腳本,而不是執行它。將您的行更改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 ' 

請參閱採購(’.’ 或 ‘source’)和在 bash 中執行文件有什麼區別?有關採購和執行腳本之間差異的詳細資訊。

另請注意,我更改了重定向的順序。要將 stderr 和 stdout 都放到同一個文件中,您> file 2>&1不需要2>&1 > file.

引用自:https://unix.stackexchange.com/questions/592243