有没有办法从脚本内将所有 stdout 和 stderr 重定向到 systemd 日志?

dea*_*sin 8 bash logging stdout stderr systemd-journald

我喜欢使用 systemd 的日志来查看和管理我自己的脚本的日志。我已经意识到您可以根据每条消息从我的用户脚本登录日志。

echo 'hello' | systemd-cat -t myscript -p emerg
Run Code Online (Sandbox Code Playgroud)

有没有办法将所有消息重定向到日志,甚至是由其他命令生成的消息?喜欢..

exec &> systemd-cat
Run Code Online (Sandbox Code Playgroud)

更新:

取得了部分成功。从终端尝试了Inian的建议。

~/scripts/myscript.sh 2>&1 | systemd-cat -t myscript.sh
Run Code Online (Sandbox Code Playgroud)

它起作用了,stdout 和 stderr 被定向到 systemd 的日志。奇怪的是,

~/scripts/myscript.sh &> | systemd-cat -t myscript.sh
Run Code Online (Sandbox Code Playgroud)

在我的 Bash 终端中不起作用。

当其他程序调用我的脚本时,我仍然需要找到一种方法在我的脚本中执行此操作。

我试过..

exec 2>&1 | systemd-cat -t myscript.sh
Run Code Online (Sandbox Code Playgroud)

但它不起作用。

更新2

从航站楼出发

systemd-cat ~/scripts/myscript.sh
Run Code Online (Sandbox Code Playgroud)

作品。但我仍在寻找一种从脚本中执行此操作的方法。

tri*_*eee 5

管道systemd-cat是一个需要与脚本同时运行的进程。Bash 为此提供了一个工具,尽管它不能移植到 POSIX sh

exec > >(systemd-cat -t myscript -p emerg) 2>&1
Run Code Online (Sandbox Code Playgroud)

进程>(command)替换启动另一个进程并返回一个伪文件名(类似于/dev/fd/63),您可以重定向到该伪文件名。mkfifo如果您想将其移植到 POSIX ,这基本上是您可以进行的黑客攻击的包装sh

  • 您可以使用脚本路径作为标签: ```-t $(realpath "$0")``` 您可以为 stderr 设置不同的优先级: ```2> >(... -p err)` `` 结果是: ```exec >>(systemd-cat -t "$(realpath "$0")" -p info ) 2> >(systemd-cat -t "$(realpath "$0")" -p错误)```` (2认同)