我有一个 Bash 脚本,首先使用打开 TCP 客户端套接字nc
并通过该套接字发送启动命令。然后,服务器通过套接字向我发送回数据(打印nc
到stdout
),当用户对他们看到的数据感到满意时,他们按 Ctrl+C,脚本应该通过套接字发送停止命令到告诉服务器停止正在做的事情。
为了使nc
套接字保持打开任意时间,我打开一个 FIFO 并tail -n +1 -f
从该 FIFO 进入nc
,因此要通过套接字发送命令,脚本只需echo
将 es 发送到 FIFO 即可。
但是在我的信号处理程序执行之后,echo
发送停止命令的调用将挂起/冻结并且永远不会返回,因此脚本只是坐在那里。
这是我的(简化的)代码:
#! /bin/bash
# make a FIFO to use as STDIN for netcat
FIFO=/tmp/temp_fifo
mkfifo $FIFO
# open up the client socket
TAIL_PID_FILE=/tmp/tail_pid
(tail -n +1 -f $FIFO & echo $! >&3) 3> $TAIL_PID_FILE | /usr/bin/nc some_server 9999 &
# get PID of tail process
TAIL_PID=$(<$TAIL_PID_FILE)
# send the start command to tell the server to start doing its work
echo "start command" >> $FIFO
# register a signal handler so that we wait until the user presses Ctrl+C
trap "echo caught signal, stopping..." SIGINT SIGTERM
# sleep 'forever' (until the signal gets caught)
sleep 4294967295
# send the stop command. ***this right here is what hangs***
echo "stop command" >> $FIFO
# kill tail process
kill $TAIL_PID
# remove FIFO
rm -f $FIFO
当在 Linux 中的 Bash 版本 4.1.2 中运行此命令时,它会正常运行,即echo
不会挂起,因此停止命令会成功发送。但 BusyBox(版本 1.22.1,在 Windows/MobaXterm 中)挂起。
我在这里对我的信号处理程序做错了什么(例如未定义的行为),因此为什么我的代码在 BusyBox 中不起作用?或者这是否暗示着 BusyBox 中存在我不知道的错误或缺失功能?