Bash Параллельные процессы в Netcat -c

Я использую netcat в сценарии bash в качестве псевдосервера, чтобы запускать дополнительные сценарии bash на основе введенных данных. Это был приятный побочный проект, однако я, кажется, застрял.

По сути, сценарий и код работают отлично, но вывод не отображается до тех пор, пока сервер не завершит процесс; так как это может занять 40 часов, нежелательно, чтобы клиент все время отображал загрузочный экран и не подсказки.

Проще говоря, я хотел бы загрузить страницу на основе содержимого до точки, игнорируя вывод всего, что следует. Код, который у меня есть до сих пор, выглядит следующим образом:

#!/bin/bash
while [ $? -eq 0 ]; do
  nc -vlp 8080 -c'(
  r=read
  $r a b c
  z=$r
  while [ ${#z} -gt 2]; do
    $r z
  done
  f=`echo $b|sed "s/[^a-z0-9_.-]//gi"`
  o="HTTP/1.0 200 OK\r\n"
  c="Content"
  if [ -z "$f" ]; then
    f="index.html"
    echo "$o$c-Type: `file -ib $f`\n$c-Length: `stat  -c%s $f`"
    echo
    cat $f
  elif [ "$f"==Encrypt ]; then
    echo $o
    echo
    echo $(bash ~/webSupport.sh currentEncrypt "$b")
    bash ~/webSupport.sh pullVars "$b" &
  else
    echo -e "HTTP/1.0 404 Not Found\n\n404\n"
  fi
  )'
done

Я искал вокруг и не могу найти способ обойти это, любая помощь будет оценена по достоинству.


person Kiradien    schedule 11.07.2013    source источник
comment
Извините, но трудно сказать, что такое входы и выходы, не могли бы вы рассказать об этом подробнее? Выглядит интересно, удачи.   -  person shellter    schedule 11.07.2013
comment
Входные данные поступают из веб-браузера, где a — это протокол, b — это путь. Выходные данные представляют собой базовый HTML, сценарий, который он вызывает для шифрования, по существу говорит «Начало шифрования»… или «Шифрование уже выполняется, пожалуйста, подождите»… из исходящего эха. По сути, это вызов sleep 500000 в строке pullVars xD   -  person Kiradien    schedule 11.07.2013


Ответы (1)


Вероятно, будет достаточно перенаправить выходные потоки (в /dev/null или файл, если вам нужно его сохранить)

bash ~/webSupport.sh pullVars "$b" >/dev/null 2>&1 &

или закрыть их:

bash ~/webSupport.sh pullVars "$b" >&- 2>&- &
person mata    schedule 11.07.2013
comment
Это творило чудеса; Раньше я предполагал, что сделать это внутри самого внешнего скрипта будет достаточно, но теперь, когда я думаю об этом, совершенно логично, что это нужно сделать здесь! Однако я должен спросить, какова цель & in ›&1 - я никогда не видел, чтобы этот символ использовался таким образом. - person Kiradien; 11.07.2013
comment
m>&n означает: перенаправить файловый дескриптор 'm' туда, где в настоящее время указывает файловый дескриптор 'n', за исключением случаев, когда n равен -, тогда это означает закрытие m. поэтому >/dev/null 2>&1 означает перенаправление stdout в /dev/null, затем перенаправление stderr туда, куда указывает stdout (теперь это /dev/null), так что это просто сокращение для >/dev/null 2>/dev/null. Более полное объяснение вы найдете здесь - person mata; 11.07.2013