我有一個 systemd 服務,它呼叫一個 PHP 腳本,tmux
在啟動時建立一個會話。
在全球範圍內,我擁有最新的tmux
發行版(V>=2.5)。
該腳本的USER
值為$HOME/bin/tmux
2.0
我需要的是systemd
使用tmux
用戶 $HOME 中的二進位。
我已經在 systemd 服務檔案中設定了 USER & GROUP 變量,但它似乎調用了全域安裝的二進位。
是否可以明確設定此服務呼叫應呼叫的二進位檔案?
如果可能的話,我不想開始在 PHP 檔案本身中硬編碼路徑。
非常感謝。
答案1
PATH
您可以在 systemd 服務中硬編碼:
[Service]
Environment=PATH=/home/someUser/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
更靈活的是 PAM。與簡單地使用相比,這是非常迂迴的bash -c '....'
,但您可以使用 PAM 來做到這一點。
/etc/pam.d
在(例如)中建立一個新的 PAM 配置/etc/pam.d/foo
並新增:
session required pam_env.so user_envfile=some-file user_readenv=1
並在 中/home/someUser/some-file
加入:
PATH DEFAULT=/home/someUser/bin:${PATH}
當然,您可以將some-file
名稱調整為更合理的名稱,但其中的路徑user_envfile
必須相對於使用者的主目錄(您User=
在服務中設定的使用者)。
然後在服務文件的[Service]
部分中新增(foo
是先前建立的文件/etc/pam.d
):
PAMName=foo
現在,當您啟動服務時(重新加載後等),將運行session
其中的模組/etc/pam.d/foo
,在本例中只是pam_env
。pam_env
將從 載入環境變量/etc/environment
,並受到 中的約束/etc/security/pam_env.conf
,然後從 載入使用者環境~/some-file
。由於PATH
中設定為預設值/etc/environment
,因此使用者環境會新增到該預設值之前。
在這裡,預設值user_envfile
是.pam_environment
,它也會被其他事物(如 SSH 或 LightDM 登入等)的 PAM 配置讀取。您可以刪除user_envfile=...
並使用預設的~/.pam_environment
.您也可以只使用現有的 PAM 配置,/etc/pam.d
其中有user_readenv=1
,但其他 PAM 模組可能會導致不必要的副作用。
答案2
這看起來非常駭人聽聞,但預先$PATH
更新似乎可行。
不過,我正在尋找副作用。 。 。
例子:
ExecStart=/bin/bash -c "PATH=/home/someUser/bin:$PATH exec /usr/bin/php /some/path/to/a/script.php"
答案3
我知道我正在挖掘一篇稍微過時的帖子,但我也試圖弄清楚如何配置 PATH/環境變量,以便我可以讓調度程序在伺服器運行時自動運行。
我確實找到了一個適用於 Ubuntu 18.04 和 18.10 的解決方案
我提供了關於如何安裝 Airflow 和 PostgreSQL在連結的後端這裡。
**從我文章的後半部來看,本質上,它可以歸結為對airflow-scheduler.system 檔案進行特定更改。
這是在 Ubuntu 上實現的「陷阱」之一。創建 Airflow 的開發團隊將其設計為在不同的 Linux 發行版上運行,因此需要進行一個小(但關鍵)的更改,以便 Airflow 在伺服器開啟時自動運行。預設的 systemd 服務文件最初如下所示:
[Unit]
Description=Airflow scheduler daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service
[Service]
EnvironmentFile=/etc/sysconfig/airflow
User=airflow
Group=airflow
Type=simple
ExecStart=/bin/airflow scheduler
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
但是,這將不起作用,因為「EnvironmentFile」協定無法在 Ubuntu 18 上運行。
Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
如果您希望 UI 自動啟動,您可能至少需要為 Airflow Scheduler 建立一個 systemd 服務文件,也可能需要為 Web 伺服器建立一個 systemd 服務文件。事實上,我們確實希望在這個實作中同時實作這兩個文件,因此我們將建立兩個文件:airflow-scheduler.service 和airflow-webserver.service。這兩個檔案都將被複製到 /etc/systemd/system 資料夾中。具體如下:
氣流調度程序.service
[Unit]
Description=Airflow scheduler daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service
[Service]
#EnvironmentFile=/etc/default/airflow
Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
User=airflow
Group=airflow
Type=simple
ExecStart=/home/ubuntu/anaconda3/envs/airflow/bin/airflow scheduler
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
#airflow-webserver.service
氣流網路伺服器.service
[Unit]
Description=Airflow webserver daemon
After=network.target postgresql.service mysql.service redis.service rabbitmq-server.service
Wants=postgresql.service mysql.service redis.service rabbitmq-server.service
[Service]
#EnvironmentFile=/etc/default/airflow
Environment="PATH=/home/ubuntu/anaconda3/envs/airflow/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
User=airflow
Group=airflow
Type=simple
ExecStart=/home/ubuntu/anaconda3/envs/airflow/bin/airflow webserver -p 8085 --pid /home/ubuntu/airflow/airflow-webserver.pid
Restart=on-failure
RestartSec=5s
PrivateTmp=true
[Install]
WantedBy=multi-user.target
最後,透過超級使用者複製命令 sudo cp 將這兩個檔案複製到 /etc/systemd/systemd 資料夾後,是時候啟動了:
sudo systemctl 啟用氣流調度程式 sudo systemctl 啟動氣流調度程式 sudo systemctl 啟用氣流網路伺服器 sudo systemctl 啟動氣流網路伺服器
答案4
在我正在設定的服務(Apache Airflow)中,我設定了一個環境檔案。
在我的/etc/systemd/system/airflow
文件中,我有這一行:
[Service]
EnvironmentFile=/etc/default/airflow
打開這個環境文件,我添加了我需要的行,在我的例子中:
SCHEDULER_RUNS=5
PATH=/opt/anaconda3/bin:$PATH
在此處新增服務能夠存取的可執行檔的任何路徑,應該沒問題。對我來說效果很好。