如何编写脚本实现命令输出同时至控制台与systemd journal并区分流优先级
同时将命令输出到控制台和systemd Journal,并区分stderr/stdout优先级
问题分析
systemd-cat能按指定优先级将输出写入Journal,但默认不会把内容回显到控制台;而单纯用管道无法区分stdout和stderr的优先级。我们需要通过进程替换+tee实现双向输出(终端+Journal),同时给两个流设置不同优先级。
解决方案
1. 直接执行命令的写法
针对你提供的测试命令,可直接用以下写法实现需求:
bash -c "cd /negative; pwd" 2> >(tee /dev/stderr | systemd-cat -t test --stderr-priority=3) > >(tee /dev/stdout | systemd-cat -t test)
- stderr处理:
2> >(tee /dev/stderr | systemd-cat ...)先把错误输出回显到控制台(/dev/stderr),再传入systemd-cat并指定高优先级(示例用3对应ERR级别,比stdout默认的INFO(6级)优先级更高) - stdout处理:
> >(tee /dev/stdout | systemd-cat ...)把标准输出回显到控制台后,传入systemd-cat使用默认优先级
2. 封装成通用脚本
如果需要重复使用,可以写一个通用脚本log_with_echo.sh:
#!/bin/bash # 用法:./log_with_echo.sh <要执行的命令> if [ $# -eq 0 ]; then echo "请传入要执行的命令" exit 1 fi "$@" 2> >(tee /dev/stderr | systemd-cat -t cmd_logger --stderr-priority=3) > >(tee /dev/stdout | systemd-cat -t cmd_logger)
给脚本添加执行权限:
chmod +x log_with_echo.sh
使用示例:
./log_with_echo.sh bash -c "cd /negative; pwd"
优先级对应参考
systemd Journal的优先级数字越小,级别越高:
- 0: emerg(紧急)
- 1: alert(告警)
- 2: crit(严重)
- 3: err(错误)
- 4: warning(警告)
- 5: notice(通知)
- 6: info(信息,默认)
- 7: debug(调试)
你可以根据需求调整--stderr-priority的数值,比如要让stderr为警告级就设为4。
验证方法
执行命令后,控制台会实时输出结果;同时执行journalctl -t test(或-t cmd_logger)查看Journal,能看到stderr条目优先级高于stdout。
内容的提问来源于stack exchange,提问作者Edward
相关产品推荐
相关产品推荐

