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에 버그나 기능 누락이 있다는 뜻인가요?