在后台运行管道 bash 脚本

在后台运行管道 bash 脚本

我正在尝试构建一个监视脚本来使用 netcat 监视本地主机通信。我构建了两个脚本,一个用于启动监视循环,另一个用于循环本身。它们如下:

启动文件

#!/bin/bash
netcat localhost 1099  | bash loop.sh &

循环语句

#!/bin/bash
while read sInput; do
     ...do something with $sInput
done

只需在没有前台的情况下运行此应用程序就可以正常工作,但一旦我尝试在后台运行此脚本,它就会立即从运行变为停止。有人可以告诉我为什么会发生这种情况以及如何缓解这个问题吗?

我的最终目标是拥有一个 bash 脚本,我可以用它创建 arch Linux 守护进程脚本,并使一切完美运行。感谢您的帮助。

答案1

听起来像是从标准输入(stdin)读取。尝试将-d(不要尝试从标准输入读取)选项添加到netcat.或者在命令行上重定向:

netcat localhost 1099 <&- | bash loop.sh &

您可能还想使用它nohup来确保当/如果您在 shell 停止之前退出该 shell 时,它不会受到不利影响。

答案2

netcat 进程正在从其标准输入读取。由于它连接到终端,因此netcat所在的进程组(即管道)必须在前台运行。

您需要在管道的开头插入一些东西,以发送服务器期望的输入。例如,对于 HTTP 服务器,您可能有类似的东西

netcat localhost 1099 <<EOF | … &
GET HTTP/1.0 http://localhost:1099/somewhere
X-Header: wibble

EOF

如果服务器没有读取任何输入,则重定向netcat的输入/dev/null

答案3

发现了一个实用程序,它承诺提供管道,而不需要单独的新守护进程 bash 脚本。可能会派上用场:https://github.com/flonatel/pipexec

pipexec -- [NETCAT netcat localhost 1099]  [LOOP bash loop.sh] '{NETCAT:1>LOOP:0}'

相关内容