根据文档,我可以执行一个类似这样的程序:
destination knotifier { program('/path/to/executable'; };
它将日志发送到可执行文件的标准输入。但是,如果我正在执行的程序需要输入作为选项的参数怎么办?有没有办法做到这一点?或者我是否必须为我正在执行的程序编写一个包装器?
答案1
如果我理解正确并且这是在 Linux 上,您可以尝试使用
/proc/self/fd/0
作为论点。这应该是进程标准输入的符号链接。同样,在某些系统上,您可以使用
/dev/stdin
这通常只是一个符号链接/proc/self/fd/0
。我没有带有 syslog-ng 的系统来测试这一点,但我认为类似以下的内容应该有效:
destination knotifier { program('/path/to/executable -i /proc/self/fd/0'); };
其中 -i 将替换可执行文件需要的任何命令行开关(如果有)。我也见过使用 /dev/fd/0,但我倾向于直接使用 /proc。欲了解更多信息,请参阅man proc
。
答案2
对于大多数命令,必须编写包装器,因为 Syslog-ng 仅在启动时执行命令。这意味着该命令本身必须有效地成为一个始终接受来自标准输入的输入的守护程序。
这很简单...
#!/bin/dash
while read line
do
/execute/my/app $line
done
不幸的是,这个脚本对我不起作用,可能是因为它不知道要使用哪个显示器。但如果您的脚本不需要 X 服务器,那么像这样的简单格式应该可以满足您的需要。
尽管这没有任何帮助,因为 Syslog-ng 只会在启动时启动程序,但我发现xargs
可以从标准输入创建位置参数这一事实很有趣。
echo 'test' | /usr/bin/xargs -I '{}' /usr/bin/kdialog --passivepopup '{}' 2