氣流調度程序.service

氣流調度程序.service

我有一個 systemd 服務,它呼叫一個 PHP 腳本,tmux在啟動時建立一個會話。

在全球範圍內,我擁有最新的tmux發行版(V>=2.5)。
該腳本的USER值為$HOME/bin/tmux2.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_envpam_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

在此處新增服務能夠存取的可執行檔的任何路徑,應該沒問題。對我來說效果很好。

相關內容