Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将命名管道输入重定向到文件_Bash_Shell_Named Pipes - Fatal编程技术网

Bash 将命名管道输入重定向到文件

Bash 将命名管道输入重定向到文件,bash,shell,named-pipes,Bash,Shell,Named Pipes,我想创建一个可以写入的文件,如中所述: 写入该文件的所有内容都应该写入日志文件,而不是由Datadog处理并通过代理发送给他们。执行上述三行后,日志文件应包含以下内容: a b c 我认为一个命名管道和一个处理这个问题的后台进程将是完美的。然而,它并没有像预期的那样工作,而且后台进程从来没有写过任何东西,即使写东西似乎是可行的 我创建了以下脚本: #/usr/bin/env bash 设置-Eeuo管道失败 log=/var/log/datadog-agent.log 触摸$log # htt

我想创建一个可以写入的文件,如中所述:

写入该文件的所有内容都应该写入日志文件,而不是由Datadog处理并通过代理发送给他们。执行上述三行后,日志文件应包含以下内容:

a
b
c
我认为一个命名管道和一个处理这个问题的后台进程将是完美的。然而,它并没有像预期的那样工作,而且后台进程从来没有写过任何东西,即使写东西似乎是可行的

我创建了以下脚本:

#/usr/bin/env bash
设置-Eeuo管道失败
log=/var/log/datadog-agent.log
触摸$log
# https://docs.datadoghq.com/developers/dogstatsd/datagram_shell/
管道=/dev/udp/localhost/8125
如果[!-p$pipe]];然后
rm-f$管道
mkdir-p“$(dirname$管道)”
mkfifo-m 0666美元管道
fi
存水弯“rm-f$管道”出口
while:;做
读取-r行>$log
完成
以及以下systemd服务:

[Unit]
Description=Fake Datadog Agent

[Service]
ExecStart=/usr/local/bin/datadog-agent
Type=exec

[Install]
WantedBy=multi-user.target
在执行
systemctl enable——现在是datadog agent
之后,服务将正确启动,但是,正如我所说,没有任何内容写入日志文件

这对我来说非常奇怪,因为打开两个shell实例,我在第一个shell中编写了以下内容:

mkfifo管道

while:;do read-r line问题的答案可以在对它的评论中找到。因此,这个问题不应该没有答案

问题中的代码按预期工作,但是,命名管道所在的路径是一个特殊路径,这就是为什么发送给它的数据从未到达脚本的原因。例如,可以在中找到Bash中相应的特殊套管

问题的解决方案是在该端口上使用真正的UDP服务器:

socat -u -v -x udp-listen:8125,fork /dev/null &>/var/log/datadog-agent.log

mkfifo-m0666/dev/udp/localhost/8125
-您认为这里会发生什么?
/dev/udp/*
不是文件,不是fifo,而是经过特殊处理的特殊文件。如果您在
/dev/udp
中创建自己的fifo,它将不再被处理,您只是在向fifo写入。@KamilCuk我认为内核不知道/dev/udp和/dev/tcp。我相信这些是只有shell才能识别的特殊字符串。bash处理/dev/udp和/dev/tcp并尝试创建套接字。此datadog程序从udp套接字读取,而不是从管道或文件读取。我希望在插入换行符的情况下将与该特定路径相呼应的任何内容捕获到文件中。查看bash源代码,我相信您必须这样做。看起来不管发生什么,都要重击这条路。如果不改变编写方面,我认为您将无能为力,像
echo 123 | tee/dev/udp/localhost/8125
这样的方法可能会奏效。
socat -u -v -x udp-listen:8125,fork /dev/null &>/var/log/datadog-agent.log