我正在尝试构建一个监视脚本来使用 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}'