nc
まず、TCPクライアントソケットを開き、そのソケットを介して起動コマンドを送信するBashスクリプトがあります。その後、サーバーはソケットを介してデータを再送信し(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
、停止されないので stop コマンドが正常に送信されます。ただし、BusyBox(Windows / MobaXtermのバージョン1.22.1)はクラッシュします。
ここでは、シグナルハンドラに問題があるのですか(例:未定義の動作)、しかし私のコードがBusyBoxで動作しないのはなぜですか?それとも、私が知らないBusyBoxにバグや機能がないことを意味しますか?