airflow-scheduler.service

airflow-scheduler.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_env.pam_env将从 加载环境变量/etc/environment,并受 中的约束/etc/security/pam_env.conf,然后从 加载用户环境~/some-file。由于PATH中的设置为默认值/etc/environment,因此用户环境将添加到此默认值的前面。

user_envfile此处,的默认值为.pam_environment,其他 PAM 配置(如 SSH 或 LightDM 登录等)也会读取该值。如果您不想影响这些内容,我在这里使用了不同的文件。您可以删除user_envfile=...并使用默认的。您也可以只使用具有 的~/.pam_environment现有 PAM 配置,但其他 PAM 模块可能会导致不必要的副作用。/etc/pam.duser_readenv=1

答案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"

您可能希望至少为 Airflow Scheduler 创建一个 systemd 服务文件,如果您希望 UI 也自动启动,那么可能还需要为 Webserver 创建一个 systemd 服务文件。事实上,我们确实希望在此实现中同时使用这两个文件,因此我们将创建两个文件,airflow-scheduler.service 和 airflow-webserver.service。这两个文件都将复制到 /etc/systemd/system 文件夹。如下所示:


airflow-scheduler.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

airflow-web服务器.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 启用 airflow-scheduler sudo systemctl 启动 airflow-scheduler sudo systemctl 启用 airflow-webserver sudo systemctl 启动 airflow-webserver

答案4

在我正在设置的服务(Apache Airflow)中,我设置了一个环境文件。

在我的/etc/systemd/system/airflow文件中,有这样一行:

[Service]
EnvironmentFile=/etc/default/airflow

打开这个环境文件,我添加了我需要的行,就我的情况而言:

SCHEDULER_RUNS=5
PATH=/opt/anaconda3/bin:$PATH

在这里添加您需要的可执行文件路径,以便服务能够访问,这样就没问题了。对我来说效果很好。

相关内容