You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写脚本实现命令输出同时至控制台与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 01:45:14