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


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

ну сделай нормальный ps aux | grep и посмотри. или тебе принципиально чтобы твой многострочник кто-то запустил и проверил?

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

моя непонимать, извините

user      4357  0.0  0.0  19992  3304 pts/0    S+   01:20   0:00 /bin/bash ./test-nc.sh
user      4360  0.0  0.0  19992   260 pts/0    S+   01:20   0:00 /bin/bash ./test-nc.sh
sudoapter
() автор топика

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

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

Спасибо, буду знать. А я думал на fifo.
Точно, так и есть.

sudoapter
() автор топика
Последнее исправление: sudoapter (всего исправлений: 2)
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от ABW

Да, tail получает SIGPIPE (tail-rc=141), запись в разорванное соединение, nc вернул 0. А если делать kill на tail, возвращает 137 (128+9). Спасибо большое.

sudoapter
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.