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

时间:2019-01-28 01:45:35

标签: bash logging stdout stderr systemd-journald

我喜欢使用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

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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

我很失望,没有比这更直接的方法了。

答案 2 :(得分:0)

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

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