2011-08-12 28 views
7

Streszczenie: Jak uruchomić interaktywne zadanie w tle?Użycie programu netcat/cat w tle skryptu powłoki (jak uniknąć zatrzymania (wejście tty)?)

Szczegóły: Próbuję uruchomić ten prosty skrypt pod powłoką popielnika (Busybox) jako zadanie w tle.

myscript.sh &

Jednakże skrypt zatrzymuje się natychmiast ...

[1] + zatrzymany (wejście terminal) myscript.sh

myscript .sh contents ... (tylko część relvant, inna niż pułapka SIGINT, SIGHUP itd.)

#!/bin/sh 

catpid=0 

START_COPY() 
{ 
    cat /dev/charfile > /path/outfile & 
    catpid = $! 
} 

STOP_COPY() 
{ 
    kill catpid 
} 

netcat SOME_IP PORT | while read EVENT 
do 
    case $EVENT in 
    start) START_COPY;; 
    stop) STOP_COPY;; 
    esac 
done 

Z prostych testów linii poleceń dowiedziałem się, że bot cat i netcat próbują odczytać z tty. Należy zauważyć, że ta wersja netcata nie ma znaku-e, aby pominąć tty.

Co można zrobić, aby uniknąć zatrzymania myscriptu?

Czego próbowałem tak za bez powodzenia:

1) netcat/kot ... </dev/tty (lub wyjście tty)

2) Prowadzenie blok zawierający kota i netcat w podpowłoce za pomocą(). To może zadziałać, ale jak złapać PID kota?

do ciebie ekspertów ...


Problem nadal istnieje. Prosty test dla was wszystkich, aby spróbować:

1) W jednym terminalu run netcat -l -p 11111 (bez &)

2) W innym terminalu run netcat localhost 11111 & (ta powinna zatrzymać po z komunikatem Zatrzymane (wejście TTY))

Jak tego uniknąć?

+0

Koniec z ekspertami? Dowolny pomysł? – LovelyVirus

+0

Jeśli masz problemy z przechwytywaniem danych wejściowych i wyjściowych z podprocesu, możesz użyć 'script'. Jeśli to nie zadziała, możesz spróbować poznać ['socat'] (http://www.dest-unreach.org/socat/doc/socat.html); ma zaawansowaną obsługę PTY, ale nie mogłem wymyślić, jak go zdobyć, aby przechwycić STDIN. –

+0

Illusatration jest częścią skryptu, który nie działał. socat nie jest opcją dla środowiska, które mam (nie mogę go tam dostać). Zmęczony, aby przekierować/dev/ttyS0 do netcat i wydaje się działać, ale przestaje odbierać sygnały. – LovelyVirus

Odpowiedz

4

Czy jesteś pewien, że podałeś swój scenariusz tak, jak jest, czy po prostu wpisałeś szorstki faks, który ma zilustrować ogólny pomysł? Skrypt w twoim pytaniu ma wiele błędów, które powinny uniemożliwić jego prawidłowe działanie, co mnie zastanawia.

  1. Przestrzenie wokół = w catpid=$! dokonać nie linię ważny przypisania zmiennej. Jeśli to było w twoim oryginalnym scenariuszu, jestem zaskoczony, że nie dostałeś żadnych błędów.

  2. Linia kill catpid powinna zakończyć się niepowodzeniem, ponieważ literalne słowo catpid nie jest prawidłowym identyfikatorem zadania. Prawdopodobnie chcesz kill "$catpid".

chodzi o rzeczywistą pytanie:

  • cat należy czytać od /dev/charfile a nie ze standardowego wejścia lub gdziekolwiek indziej. Czy na pewno próbowałeś odczytać dane wejściowe tty?

  • Czy próbowałeś przekierować wejście netcat, takie jak netcat < /dev/null, jeśli nie potrzebujesz netcat, aby przeczytać cokolwiek?

+0

Nie, to było tylko ilustration i jak zauważyłeś, są literówki. W każdym razie kot faktycznie czyta z/dev/charfile (testowany na linii poleceń). Właśnie założyłem, że albo netcat albo kot powoduje ten problem Stopped (tty input). Spróbował/dev/null z netcat bez powodzenia. – LovelyVirus

9

prawdopodobnie chcesz netcat's "-d" option, który mówi, że nie będzie czytać z STDIN.

6

Mogę potwierdzić, że -d pomoże netcat działać w tle.

widziałem ten sam problem z:

nc -ulk 60001 | nc -lk 60002 & 

każdym razem, kiedy zapytaliśmy o jobs, wejście rury zatrzyma.

Zmiana polecenia następuje stałe go:

nc -ulkd 60001 | nc -lk 60002 & 
1

muszę użyć netcata że nie ma opcji -d.

"echo -n | netcat ... &" wydaje się być skutecznym obejściem: tzn. Natychmiast zamknij standardowe wejście do netcat, jeśli nie musisz go używać.

0

Ponieważ nie było jeszcze naprawdę odpowiedział, jeśli za pomocą opcji -d BusyBox i nie jest dostępny, następujące polecenie zachowa netcata „żywe”, gdy wysłany do tła:

tail -f /dev/null | netcat ... 

netcat < /dev/null i echo -n | netcat nie działa dla mnie.