【问题标题】:catch error message and create Journal entry捕获错误消息并创建日记条目
【发布时间】:2017-04-06 17:42:35
【问题描述】:

以下代码放在我正在使用的许多脚本之上...

#!/bin/bash

# redirect all error messages to the protocol,
# then print the same message to stdout
exec 1> >(logger -i -s -t $0 -p 4) 2>&1

这行代码将使运行我的脚本时发生错误的协议条目。 但是当通过stdinstdout 进行通信时,此代码无法正常工作。我只想记录错误消息。

说实话,我不知道我是如何设法让这行编码工作的。

尽管如此,我正在寻找一个代码来替换 execlogger 的组合 function 放入 trap "createErrorMessage" ERR 但我不知道如何捕捉/以这种方式接收错误消息。

我的目标是只创建所有错误消息的协议条目。

需要明确的是,我不想在每段代码之后使用$?,也不想用Variable=$() 捕获每段代码。

这可能吗?

【问题讨论】:

  • 为什么这个问题被标记为systemd?问题中根本没有提到它。也不清楚“错误消息的协议条目”是什么意思。

标签: linux bash syslog


【解决方案1】:

虽然logger 将输出发送到syslog,但systemd-catsystemd 执行相同类型的功能。例如:

echo "hello" | systemd-cat
journalctl | tail -10

如果您将脚本作为 systemd 服务单元运行,则无需使用 systemd-cat:默认情况下,systemd 将发送它控制日志的服务的 STDOUT 和 STDERR。

有关该工具的更多信息,请参阅man systemd-cat

【讨论】:

  • 对不起,我的帖子有误导性,所以我更新了它。是的,我知道systemd-cat。它的工作原理类似于logger,但功能更少。我不将我的脚本用作服务,所以我绑定到systemd-cat & logger 之类的工具,但我只想创建错误消息条目。
【解决方案2】:

也许不明白你想要什么,但是说有这个脚本mytest.sh

date > jj
cat jj - jjj    # jj + stdin + (nonexistenxt) jjj #e.g. error too
mkdir jj        #error

所以,当您将其用作带有重定向的脚本时,

echo "Hello world" | bash mytest.sh > output

你会得到:

1.) 在文件output

Thu Apr  6 21:21:13 CEST 2017
Hello world

在屏幕上 - 错误

cat: jjj: No such file or directory
mkdir: jj: File exists

现在,把上面的脚本也改一下

((

date > jj
cat jj - jjj    # jj + stdin + (nonexistext jjj)
mkdir jj    #error

) 3>&1 1>&2 2>&3 | tee >(logger -i -t $0 -p 4)) 3>&1 1>&2 2>&3

注意,从记录器参数中删除了-s

现在什么时候再使用它

echo "Hello world" | bash mytest.sh > output
  • 如您所料,输出中的stdout
  • stderr 将对屏幕执行操作(您可以再次重定向)
  • 记录器将记录所有错误。

如你所知,它确实有效

  • 交换标准输出和标准错误
  • 将标准输出(现在是标准错误)通过管道传送到记录器进程
  • 换回标准输出/标准错误

它可能会更简单,因为使用-s 的记录器可以将消息复制到stderr 本身,但这普遍适用。不幸的是,它效率低下,因此需要多使用 2 个分叉。注意((

使用:

somefunc() { some actions...; }
trap 'somefunc' ERR

不会像您期望的那样帮助您。在somefunc 中做一些花哨的重定向为时已晚,因为somefunc 触发错误发生后,例如错误消息已经打印到stderr

【讨论】:

  • 没有夹具(( 是否可以做到这一点?也许在您的代码中再次使用exec
  • @suleiman 不是真的,因为第一个子shell 已交换,第二个子shell 交换回来。由于tee,您需要中间。但也许有人会带来一些更好的解决方案.. :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多