我在 Raspberry Pi 上创建了一个简单的 oneshoot systemd 服务文件,该文件在启动时启动,并将特定的日志命名空间和一些 dmesg 本地记录到文件中。
在本地执行脚本作为测试似乎可以工作,但是自动启动有问题并且根本不起作用。
测试服务
[Unit]
Description=Test message
After=multi-user.target
[Service]
Type=oneshot
ExecStart=/data/test.sh
StandardOutput=journal
[Install]
WantedBy=multi-user.target
系统很简单,没有太多内容。只有 root 用户存在。
系统还会启动一个温度记录器,该记录器会记录到日志并具有 LogNamespace=temp_logger。我没有把它放在依赖项或其他地方。
现在,当我执行包含以下内容的文件 test.sh 时:
#!/bin/bash
echo $(date)
TEST_DIR=/data/testdirectory
mkdir -p $(TEST_DIR)
journalctl -f --namespace=temp_logger > ${TEST_DIR}/journaltemp.log &
dmesg -w > ${TEST_DIR}/dmesg.log &
看起来效果很好。没有错误,什么都没有。看起来不错。如果我启用该服务systemctl enable test
并重新启动系统,似乎会出现一些问题。
该目录未创建,日志文件也不存在。 (我从测试中删除了那些)
检查时,systemctl status test
我可以看到错误消息,告诉我未找到命令 echo、mkdir 等。
当我将所有来自echo
或mkdir
等的调用修改为/bin/echo
等时/bin/mkdir
,它似乎有效。我得到回声、日期和目录。我使用命令检查了对二进制文件的所有调用which
并调整了路径。
然而,日志日志似乎不起作用。文件存在但没有内容(大小 0)
那里到底出了什么问题?为什么我需要提供二进制文件的绝对路径?为什么journalctl 不起作用?
答案1
事实证明,该服务具有简单的依赖性,它在日志服务本身启动之前启动。
这可能就是为什么文件在那里,但大小一直为 0。lsof
没有向我显示文件 dmesg.log 或journaltemp.log 的任何进程
我最终只是 sleep 5
在文件 test.sh 的开头放置了一个 good ol' ,从那时起它就可以工作了。
通过设置在服务文件中的日志之后启动,可能有一个更好/更干净的解决方案,但我无法弄清楚。睡眠正常,现在是我的 test.sh 的一部分