直接在服务单元文件的[service]段设置standardoutput=journal即可,同时建议配置standarderror=journal和standardinput=null;避免在execstart中重定向,确保日志被journald结构化捕获并可用journalctl查看。

直接在服务单元文件里设置 StandardOutput=journal 就行,这是 systemd 默认接管 stdout 并交由 journald 处理的最简方式,无需重定向、不依赖 logger,也不用改脚本。
在 .service 文件中显式声明输出目标
编辑你的服务文件(如 /etc/systemd/system/myscript.service),在 [Service] 段落中加入:
-
StandardOutput=journal:让 systemd 把进程的标准输出直接写入 journal socket,自动打上
_SYSTEMD_UNIT、_PID、_UID等结构化字段 - StandardError=journal(建议同步配置):确保错误流也走 journal,避免 stderr 被丢弃或混入其他输出
- StandardInput=null(推荐):防止服务意外读取 stdin 导致 hang 住
避免常见干扰操作
别在 ExecStart 行里做重定向,否则会绕过 journal 的上下文捕获:
- ❌ 错误写法:
ExecStart=/path/to/script.sh 2>&1 | logger -t myapp—— 这样日志失去 unit 标识和时间戳精度 - ❌ 错误写法:
ExecStart=/path/to/script.sh > /tmp/out.log 2>&1—— 日志脱离 systemd 管控,无法用journalctl -u myscript查看 - ✅ 正确写法:
ExecStart=/path/to/script.sh,配合上面的 Standard* 配置即可
验证是否生效
配置保存后重载并重启服务:
sudo systemctl daemon-reloadsudo systemctl restart myscript.service- 检查日志:
journalctl -u myscript.service -n 20 -o short-precise - 确认每条日志都带
SYSLOG_IDENTIFIER=myscript.service或_SYSTEMD_UNIT=myscript.service
补充说明
如果系统全局默认没启用 journal 输出,可检查 /etc/systemd/system.conf 中的 DefaultStandardOutput 是否为 journal;但单个服务配置优先级更高,所以局部设好就足够。











