我喜欢使用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
有效。但我仍在寻找一种从脚本中执行此操作的方法。
答案 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
给出的。