LINUX.ORG.RU

Почему процесс создается два раза?

 , ,


0

1
#! /bin/bash

p="/tmp/tmpipe"
[ -p $p ] || mkfifo $p

while true; do
echo "*** Starting session..."

tail -f $p | nc -l 4321 | {
  while read f; do
    f=${f//[^a-zA-Z0-9_.-]/}
    case $f in
          '') ls > $p ;;
      "quit") break ;;
           *) [ -f $f ] && cat $f > $p || echo "File Not Found" > $p ;;
    esac
  done
}
done
---------
> pgrep test-nc.sh
4039
4042

Потому что последняя часть конвейера у тебя выполняется в «subshell», что с точки зрения pgrep и ps выглядит как процесс с тем же ${0}, что и у родителя. Смотреть в таких случаях лучше через 'ps axf | less -S'. Попробуй добавить в начало 'shopt -s lastpipe' и посмотреть разницу.

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

Можно еще один небольшой вопрос?
Я взял пример отсюда: https://mnorin.com/fejkovy-j-smtp-server-na-bash.html
И убрал из него следующие строки:

...

QUIT*) # Окончание сессии

echo "221 2.0.0 Bye" > $S

# Находим запущенные нами процессы tail и netcat и убиваем их
# Без окончания этих процессов следующая сессия не запустится

# vvvv это убрал vvvv 
TAIL_PID=$(ps ax | grep "tail -f $S" | grep -v grep | cut -d' ' -f 1)
NETCAT_PID=$(ps ax | grep "netcat -l -p 25" | grep -v grep | cut -d' ' -f 1)
kill -9 $TAIL_PID $NETCAT_PID

# Выход в главную программу
return

...

И все отрабатывает нормально, сессия прекрасно перезапускается. Т.е. получается, что можно не убивать tail и netcat?

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

Вообще-то говоря, в твоём примере ввод «quit» не срабатывает, на самом деле nc завершается при попытке записи в уже закрытый (по завершению последнего члена) конвейера, либо по закрытию соединения клиентом. 'tail -f' вообще может завершится только схлопотав SIGPIPE по завершению nc. Кстати, корректно было бы 'tail -f -n +1'. Чтобы видеть, что реально происходит, натыкай отладочного вывода:

D () { echo "${@}" >&2 ; }
{ tail -f -n +1 "${p}" ; D tail-rc=${?} ; } | # и т.д. и т.п. ...

ABW ★★★★ ()