有没有办法从脚本中将所有标准输出和标准输出重定向到 systemd 日志



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

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

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

exec &> systemd-cat

更新:

一些部分成功。从终端尝试了伊尼安的建议。

~/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

工程。 但我仍在寻找一种从脚本中做到这一点的方法。

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

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

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

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

这个答案的关键思想是由Freenode/libera.chat用户grawity给出的。

显然,出于超出我的原因,您不能真正将所有 stdout 和 stderr 重定向到脚本中的 journald,因为它必须通过管道传输。 为了解决这个问题,我发现了人们与 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

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

相关内容

  • 没有找到相关文章

最新更新