我需要创建 systemd 服务的多个实例。启动服务时是否可以传递参数,这些参数将是 php 脚本的参数?
例如,假设我有一个脚本,,test_systemd.php
它有两个参数,分别为mod
和rem
。
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]
...