![向 systemd 发送信号以阻止消息出现在控制台上](https://linux22.com/image/102016/%E5%90%91%20systemd%20%E5%8F%91%E9%80%81%E4%BF%A1%E5%8F%B7%E4%BB%A5%E9%98%BB%E6%AD%A2%E6%B6%88%E6%81%AF%E5%87%BA%E7%8E%B0%E5%9C%A8%E6%8E%A7%E5%88%B6%E5%8F%B0%E4%B8%8A.png)
systemd 的手册页https://www.freedesktop.org/software/systemd/man/systemd.html表示可以发送SIGRTMIN+21
到 systemd 进程以禁用状态消息(例如Started Login service.
等)出现在控制台上。手册页的相关片段如下:
SIGRTMIN+21
Disables display of status messages on the console, as controlled via
systemd.show_status=0 on the kernel command line.
当我查看进程表时,至少有 4 个与 systemd 相关的不同进程。手册页中提到了其中哪一个?
~# ps -ef |grep [s]ystemd
root 448 1 0 18:47 ? 00:00:01 /lib/systemd/systemd-journald
root 450 1 0 18:47 ? 00:00:00 /lib/systemd/systemd-udevd
root 722 1 0 18:47 ? 00:00:00 /sbin/cgmanager -m name=systemd
root 723 1 0 18:47 ? 00:00:00 /lib/systemd/systemd-logind
message+ 742 1 0 18:47 ? 00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
我编写了一个简单的守护进程,除了继续休眠 10 秒并确保它在启动时启动之外,什么也不做。
我进行了大胆的猜测,并将信号发送到cgmanager
进程(pid 722
),如下所示:
# kill -SIGRTMIN+21 722
控制台上有几条有关重新启动 Cgroup 守护程序的消息,但控制台上继续出现“Start job ....”消息:
[ OK ] Stopped Cgroup management daemon.
[ OK ] Started Cgroup management daemon.
Server lin1 ttyS0
[ ***] A start job is running for Sleep te... initialization (51s / no lim
有没有人能够像我上面尝试的那样禁用控制台日志记录?如果是这样怎么办?
答案1
如果您将 systemd 作为 init 系统运行,则需要将这些信号发送到的进程是 PID 1 的进程(可能会init
在您的系统上调用它,而不是systemd
)。
我认为该进程在收到 SIGRTMIN+21 时不会记录任何内容,但在收到 SIGUSR1 时会记录任何内容(这会导致 systemd 重新连接到 D-Bus 总线):
kill -SIGUSR1 1
journalctl -e
然后将显示:
Dez 30 20:34:25 mineo-foobar systemd[1]: Trying to reconnect to bus...
上面仅表明 PID 1 是发送信号的正确目标,但要停止状态消息,您仍然必须使用kill -SIGRTMIN+21 1
.