4

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

echo 'hello' | systemd-cat -t myscript -p emerg

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

exec &> systemd-cat

更新:

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

~/scripts/myscript.sh 2>&1 | systemd-cat -t myscript.sh

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

~/scripts/myscript.sh &> | systemd-cat -t myscript.sh

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

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

我试过了..

exec 2>&1 | systemd-cat -t myscript.sh

但它不起作用。

更新 2

从终端

systemd-cat ~/scripts/myscript.sh

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

4

3 回答 3

3

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

exec > >(systemd-cat -t myscript -p emerg) 2>&1

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

于 2019-01-29T07:21:25.747 回答
0

显然,出于我无法理解的原因,您不能真正将所有 stdout 和 stderr 从脚本中重定向到日志,因为它必须通过管道输入。为了解决这个问题,我发现人们使用 syslog 记录器的一个技巧,它有效相似地。

您可以将所有代码包装到一个函数中,然后将该函数通过管道传输到 systemd-cat。

#!/bin/bash

mycode(){
  echo "hello world"
  echor "echo typo producing error"
}
mycode | systemd-cat -t myscript.sh

exit 0

然后搜索日志日志..

journalctl -t myscript.sh --since yesterday

我很失望没有更直接的方法可以做到这一点。

于 2019-01-29T06:57:46.343 回答
0

如果您的脚本碰巧不是 shell 脚本,而是其他允许加载链接到的扩展模块的编程语言-lsystemd,那么还有另一种方法。有一个库函数sd_journal_stream_fd可以非常精确地匹配手头的任务。从 bash 本身(而不是某些孩子)调用它似乎充其量是困难的。例如,在 Python 中,它可以作为systemd.journal.stream. 这个函数本质上是连接一个unix域流套接字并传达正在传输的数据类型(例如优先级)。在这里使用 shell 的困难部分是使它连接一个 unix 域套接字(而不是在一个孩子中连接)。

Freenode/libera.chat user 给出了这个答案的关键思想grawity

于 2021-05-19T19:55:04.473 回答