如何为调用 php 脚本的 systemd 单元文件传递变量?

如何为调用 php 脚本的 systemd 单元文件传递变量?

我需要创建 systemd 服务的多个实例。启动服务时是否可以传递参数,这些参数将是 php 脚本的参数?

例如,假设我有一个脚本,,test_systemd.php它有两个参数,分别为modrem

php:

<?php
$val = getopt(null, ['mod:','rem:']);
echo $val['mod']."\n";
echo $val['rem']."\n";
echo "\n";

?>

如果我通过 php 运行它,我只需这样做php test_systemd.php --mod foo --rem bar

将会回响

foo
bar

根据 systemd 文档,我应该使用Environment=,但我不确定该怎么做。假设我有一个名为 的 systemd 单元文件test-systemd-params.service

Description=Systemd Params Test
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/php -f /path/to/test_systemd.php
StandardOutput=file:/var/log/test-multiple-systemd.log
Environment=???? <--- WHAT GOES HERE?

[Install]
#Start after boot
WantedBy=multi-user.target

我不明白我需要在这里放什么。启动服务实例时是否可以传递这两个参数(mod和)?rem

我发现例如,它有两Environment行,但其中一行是静态值!我需要动态值,例如:

Environment=mod=%i Environmen=rem=%i

示例代码如下:

[Service]
Type=notify
Environment=LANG=C <--- STATIC, but need another dynamic
Environment=HTTPD_INSTANCE=%i <--- dynamic, great, but need another
ExecStartPre=/bin/mkdir -m 710 -p /run/httpd/instance-%i
ExecStartPre=/bin/chown root.apache /run/httpd/instance-%i
ExecStartPre=/bin/mkdir -m 700 -p /var/lib/httpd/instance-%i
ExecStartPre=/bin/chown apache.apache /var/lib/httpd/instance-%i
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND -f conf/%i.conf
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful -f conf/%i.conf

答案1

根据 systemd 文档,我应该使用Environment=,但我不确定该怎么做。假设我有一个名为 的 systemd 单元文件test-systemd-params.service

这是一个使用的示例Environment=

Description=Systemd Params Test
Wants=network-online.target
After=network-online.target

[Service]
Environment="MOD=foo" "REM=bar"
ExecStart=/usr/bin/php -f /path/to/test_systemd.php --mod ${MOD} --rem ${REM}
StandardOutput=file:/var/log/test-multiple-systemd.log

[Install]
#Start after boot
WantedBy=multi-user.target

这不是您所寻找的,因为变量是静态值。


我发现例如,它有两Environment行,但其中一行是静态值!我需要动态值,例如:

您提供的示例代码片段指的是服务模板。您可以通过只有一个变量这边走。systemd 服务可以通过“[电子邮件保护]“ 句法。

以下是一个示例实现

Description=Systemd Params Test
Wants=network-online.target
After=network-online.target

[Service]
Environment=MOD=%i
Environment=REM=bar
ExecStart=/usr/bin/php -f /path/to/test_systemd.php --mod ${MOD} --rem ${REM}
StandardOutput=file:/var/log/test-multiple-systemd.log

[Install]
#Start after boot
WantedBy=multi-user.target

然后像这样启动服务:

systemctl start [email protected]
systemctl start [email protected]

所以它仍然不是您正在寻找的,因为您仍然有一个静态变量。


我唯一能看到的(未经测试)传递多个变量将使用EnvironmentFile=指令和分离的配置文件动态的使用@argument合成器命名。

[Service]
EnvironmentFile=/path/to/config/%i
ExecStart=/usr/bin/php -f /path/to/test_systemd.php --mod ${MOD} --rem ${REM}
StandardOutput=file:/var/log/test-multiple-systemd.log

示例配置文件/path/to/config/,假设conf1

MOD=foo
REM=bar

然后像这样启动服务:

systemctl start [email protected]
systemctl start [email protected]
...

相关内容