应该向终端打印消息的 Systemd 单元脚本不起作用

应该向终端打印消息的 Systemd 单元脚本不起作用

我有一台运行着 named-chroot 的 CentOS7 服务器。问题是,named 和 named-chroot 在 CentOS7 中是独立的 systemd 服务,而且我的系统很稳定,但内存不足。几个月后才需要进行 BIND 维护。当我有 BIND 工作要做时,我总是忘记输入

systemctl restart named-chroot

然后输入

systemctl restart named

如果我弄错了,没有任何警告表明我启动了错误的服务。

我想使用 systemd 配置来编辑命名服务,以提醒我犯了一个错误。这是我覆盖标准命名服务所能做到的:我使用

systemctl edit named

并输入以下内容:

[Unit]
Description=You want named-chroot
Wants=
Before=
After=

[Service]
Type=simple
EnvironmentFile=
Environment=
ExecStartPre=
ExecStart=
ExecStart=/bin/bash -c "/usr/bin/echo 'No, you want named-chroot'"
ExecReload=
ExecReload=/bin/bash -c "/usr/bin/echo 'No, you want named-chroot'"
ExecStop=
ExecStop=/bin/bash -c "/usr/bin/echo 'No, you want named-chroot'"
StandardOutput=journal+console
PrivateTmp=false

这是我所能得到的。echo 命令的结果将在 journalctl 和 systemctl status 中可见。当然,理想的情况是将它们打印在终端上,但我还没有弄清楚。这不起作用:

StandardOutput=tty
TTYPath=/dev/tty

或其变体;我收到错误消息,告诉我 /dev/tty 在 bash 中不可用!

另一个问题是:即使使用上述文件,以下命令也可能导致 named-chroot 停止,并且没有可见的指示或警告:

systemctl restart named
systemctl start named

当我覆盖了所有能找到的命名服务选项时,我不明白为什么由 named-chroot 启动的命名守护进程会受到我修改后的命名脚本的影响。

如果您是 systemd 专家,请帮助我完成这项工作。

答案1

你为什么不掩盖服务? 这会阻止它启动或以任何方式被使用。

# systemctl mask named
Created symlink /etc/systemd/system/named.service → /dev/null.

# systemctl start named
Failed to start named.service: Unit named.service is masked.

答案2

替代建议。删除该named单元并创建别名。

通过在单元搜索路径之一中创建从新名称到现有名称的符号链接,可以为单元起别名(具有备用名称)。例如,systemd-networkd.service 具有别名 dbus-org.freedesktop.network1.service,在安装期间作为符号链接 /usr/lib/systemd/system/dbus-org.freedesktop.network1.service 创建。此外,单元文件可通过 [Install] 部分中的 Alias= 指令指定别名;这些别名仅在单元启用时有效。启用单元后,将为这些名称创建符号链接,禁用单元后将删除符号链接。例如,reboot.target 指定 Alias=ctrl-alt-del.target,因此启用后,每当按下 CTRL+ALT+DEL 时都会调用它。别名可用于 enable、disable、start、stop、status 等命令以及单元依赖性指令 Wants=、Requires=、Before=、After=、...,但通过 Alias= 指定的别名仅在单元启用时有效。别名不能与 preset 命令一起使用。

https://www.freedesktop.org/software/systemd/man/systemd.unit.html

相关内容