Bash
從 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 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
.