我有一个简单的 systemd 服务(称为“testpath”),它只是打印一些要由日志捕获的输出。日志会间歇性地、不可预测地丢失部分输出。这种行为似乎非常不稳定,测试用例又如此微不足道,很难看出这可能是任何一种预期行为。
有人能解释一下 systemd 的预期行为吗?如果做不到,有人能建议一个策略来尝试将其作为一个错误隔离吗?
该服务只需运行此脚本:
% cat ~/tmp/testpath.bin
#!/bin/bash
sleep 0.1
ps -p $$
echo Echo statement.
预期的行为是每次系统调用时,ps
和echo
输出都应出现在日志中。但实际上,输出ps
可能出现一半的时间,而输出echo
可能出现 90% 的时间。例如,手动运行systemctl --user start testpath
会产生此日志:
% journalctl --user -u testpath.service --follow
<some lines elided>
Oct 30 00:47:36 skierfe systemd[1518]: Started Testpath service.
Oct 30 00:47:36 skierfe testpath.bin[862530]: PID TTY TIME CMD
Oct 30 00:47:36 skierfe testpath.bin[862530]: 862527 ? 00:00:00 testpath.bin
Oct 30 00:47:36 skierfe testpath.bin[862527]: Echo statement.
Oct 30 00:53:17 skierfe systemd[1518]: Started Testpath service.
Oct 30 00:53:17 skierfe testpath.bin[863505]: Echo statement.
Oct 30 00:53:20 skierfe systemd[1518]: Started Testpath service.
Oct 30 00:53:21 skierfe testpath.bin[863545]: Echo statement.
Oct 30 00:53:23 skierfe systemd[1518]: Started Testpath service.
Oct 30 00:53:23 skierfe testpath.bin[863553]: Echo statement.
Oct 30 00:53:26 skierfe systemd[1518]: Started Testpath service.
Oct 30 00:53:26 skierfe testpath.bin[863558]: Echo statement.
Oct 30 00:53:28 skierfe systemd[1518]: Started Testpath service.
Oct 30 00:53:33 skierfe systemd[1518]: Started Testpath service.
Oct 30 00:53:33 skierfe testpath.bin[863577]: PID TTY TIME CMD
Oct 30 00:53:33 skierfe testpath.bin[863577]: 863574 ? 00:00:00 testpath.bin
Oct 30 00:53:33 skierfe testpath.bin[863574]: Echo statement.
Oct 30 00:53:37 skierfe systemd[1518]: Started Testpath service.
Oct 30 00:53:37 skierfe testpath.bin[863579]: Echo statement.
单元文件:
skierfe:(f)..config/systemd/user % cat ~/.config/systemd/user/testpath.service
[Unit]
Description = Testpath service
[Service]
ExecStart = %h/tmp/testpath.bin
我考虑过或尝试过的事情(均无帮助):
- 系统资源争用:否,新的 Core i5 系统负载较低
- 每个速率限制参数#774809:没有,
RateLimitInterval
并且RateLimitBurst
在 /etc/systemd/journald.conf 中被注释掉,而且日志记录率无论如何都是微不足道的 - 延长或删除
sleep
命令(时间问题?) - 将服务更改为
Type=oneshot
- 设置显式
StandardOutput=journal
每#1089887
这些都没有改变行为。
我使用的是 x86_64 Ubuntu 22.04,带有最新软件包更新。
skierfe:(f)~/tmp % systemd --version
systemd 249 (249.11-0ubuntu3.6)
+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY -P11KIT -QRENCODE +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified