2

要将命令的 stderr 重定向到 syslog,我使用了一个帮助程序,例如

with_logger my-tag command arg1 ...

with_logger 在哪里

#!/bin/bash
syslog_tag="$1"
shift
exec "$@" 2> >(exec /usr/bin/logger -t "$syslog_tag")

这里 2 个exec调用和进程替换用于避免 bash 进程等待命令或记录器命令完成。然而,这会产生一个僵尸。也就是说,当命令退出关闭其标准错误后,记录器进程退出时,没有人等待该进程。这会导致父进程收到关于未知子进程的意外信号。

为了解决这个问题,我想我必须以某种方式否认这个>()过程。有没有办法做到这一点?

更新以澄清问题

我需要从另一个程序调用我的包装脚本,而不是从 bash 脚本。

更新 2 - 这是一个错误的问题

请参阅下面的答案。

4

2 回答 2

1

我只想定义一个简短的 shell 函数

to_logger () {
    exec /usr/bin/logger -t "$1"
}

并以最短的时间调用您的代码

2> >(to_logger my-tag) command arg1 ...

这有几个好处:

  1. 该命令可以是任何 shell 结构;您没有将命令作为参数传递给另一个命令;您只是在重定向任意命令的标准错误。

  2. 您正在生成一个更少的进程来处理日志记录。

于 2014-11-21T22:25:02.177 回答
0

我的问题是错误的。

在我的设置中,我使用supervisord来控制几个进程。由于它对 syslog 的支持有限,并且在将进程的 stderr 重定向到 syslog 时不允许使用不同的标签,因此我使用上面的 shell 脚本。在测试脚本时,我注意到CRIT reaped unknown pid <number>日志中针对 supervisord 本身的消息。我认为这很糟糕,并试图解决这个问题。

但事实证明,这些信息根本不重要。事实上,supervisord 正在做正确的工作,并且在其最新消息来源中,消息已从 CRIT 更改为 INFO。所以这里没有什么可以回答的,因为有问题的脚本没有问题:)

于 2014-11-23T14:28:45.323 回答