LINUX.ORG.RU

Убить NetCat

 ,


0

1
while [ 1 ]; do 
        CMD=$(nc -l localhost $PORT ); 
        echo "Recv: "$CMD; 
        $CMD;
done;

Я пошёл на такую уловку:

function sigterm_trap () {
        pkill -9 -P $$
        exit 0
}
trap sigterm_trap SIGTERM
Но по убийству процесса nc продолжает висеть и следующий запуск сервиса ничего не даст, так как «nc: Address already in use». Функция не отрабатывает, почему-то. Вот код завершения сервиса:
stop() {
  if [ ! -f "$PIDFILE" ] || ! kill -0 $(cat "$PIDFILE"); then
    echo 'Service not running' >&2
    return 1
  fi
  echo 'Stopping service...' >&2
  kill -15 $(cat "$PIDFILE") && rm -f "$PIDFILE"
  echo 'Service stopped' >&2
}

Есть вариант с pkill " nc$", но это некрасиво и не очень правильно.

Как мне быть?


в релейтедах смотри внизу темы.
в том году такая уже была ;)

aol ★★★★★ ()
Ответ на: комментарий от alextk

А теперь подумай что будет, если ты прибьешь процесс самого скрипта прм запущенном netcat? Если netcat жестко привязан к STDOUT - он схлопнется вместе с ним. А если он при закрытии STDOUT обрабатывает эту ситуацию и отвязывается от него - он останется висеть и слушать трафик.

Так что - форкай его в background, получай pid и дожидайся завершения работы перед новой итерацией. А при получении сигнала, сначала прибивай его, а потом уже вали сам скрипт

Pinkbyte ★★★★★ ()
Последнее исправление: Pinkbyte (всего исправлений: 2 )
Ответ на: комментарий от Pinkbyte

Как бы мне это сделать?

while [ 1 ]; do 
        NCPID=$(nc -l localhost $PORT &>$CMD & echo $!); 
        wait $NCPID
        echo "Recv: "$(<$CMD); 
        $(<$CMD);
done;

Чего-то не то делает этот код.

alextk ()
Ответ на: комментарий от Pinkbyte

Вот, так получше, но всё равно wait мне ругается, что этот процесс не принадлежит его оболочке.

while [ 1 ]; do 
        NCPID=$(nc -l localhost $PORT > $CMD & echo $!); 
        wait $NCPID
        echo "Recv: "$(<$CMD); 
        $(<$CMD);
done;
alextk ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.