我有一个 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
,其他 PAM 配置(如 SSH 或 LightDM 登录等)也会读取该值。如果您不想影响这些内容,我在这里使用了不同的文件。您可以删除user_envfile=...
并使用默认的。您也可以只使用具有 的~/.pam_environment
现有 PAM 配置,但其他 PAM 模块可能会导致不必要的副作用。/etc/pam.d
user_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
在这里添加您需要的可执行文件路径,以便服务能够访问,这样就没问题了。对我来说效果很好。