2011-08-12 8 views
7

Resumen: ¿Cómo ejecutar una tarea interactiva en segundo plano?Uso de netcat/cat en una secuencia de comandos shell de fondo (Cómo evitar detenido (entrada tty)?)

Detalles: Estoy tratando de ejecutar este script simple en ash shell (Busybox) como una tarea en segundo plano.

myscript.sh &

Sin embargo, la secuencia de comandos se detiene inmediatamente ...

[1] + Stopped (entrada TTY) myscript.sh

El miscript .sh contents ... (solo la parte relvant, aparte de que atrapo SIGINT, SIGHUP, etc.)

#!/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 

A partir de simples pruebas de línea de comandos encontré que bot cat y netcat intentan leer de tty. Tenga en cuenta que esta versión de netcat no tiene que suprimir tty.

Ahora, ¿qué se puede hacer para evitar que myscript se detenga?

cosas que he probado hasta para sin ningún éxito:

1) netcat/cat ... </dev/tty (o la salida de tty)

2) Ejecutar el bloque que contiene gato y netcat en una subcamada usando(). Esto puede funcionar, pero ¿cómo agarrar el PID del gato?

a usted expertos ...


todavía existe el problema. Una prueba simple para todos a probar:

1) En un terminal de ejecución netcat -l -p 11111 (sin &)

2) En otro terminal localhost plazo netcat 11111 & (Esto debe detenerse después de una mientras que con el mensaje Detenido (entrada TTY))

¿Cómo evitar esto?

+0

¿No hay más expertos? ¿Alguna idea? – LovelyVirus

+0

Si está bien con la captura de entrada y salida desde un subproceso, puede usar 'script'. Si eso no funciona, puede intentar investigar ['socat'] (http://www.dest-unreach.org/socat/doc/socat.html); tiene un manejo avanzado de PTY, pero no pude encontrar la forma de capturar STDIN. –

+0

La ilusión es parte del script que no funcionó. socat no es la opción para el medio ambiente que tengo (no puedo obtenerlo allí). Se han cansado de redirigir/dev/ttyS0 a netcat y parece estar funcionando, pero luego deja de recibir señales. – LovelyVirus

Respuesta

4

¿Estás seguro de que has dado tu secuencia de comandos como está o simplemente escribiste un facsímil aproximado para ilustrar la idea general? El script en su pregunta tiene muchos errores que deberían evitar que se ejecute correctamente, lo que me hace pensar.

  1. Los espacios alrededor del = en catpid=$! hacen no la línea una asignación variable válido. Si eso estaba en tu script original, me sorprende que no hayas recibido ningún error.

  2. La línea kill catpid debe fallar porque la palabra literal catpid no es una identificación de trabajo válida. Probablemente desee kill "$catpid".

cuanto a su pregunta real:

  • cat deben leer desde /dev/charfile y no desde la entrada estándar o en cualquier otro lugar. ¿Estás seguro de que estaba intentando leer la entrada de tty?

  • ¿Ha intentado redireccionar la entrada de netcat como netcat < /dev/null si no necesita netcat para leer algo?

+0

No, era solo una ilustración y como usted señaló hay errores tipográficos. De todos modos, el gato está leyendo desde/dev/charfile (probado en la línea de comandos). Simplemente asumí que netcat o cat está causando este problema Stopped (entrada tty). También probé/dev/null con netcat sin éxito. – LovelyVirus

9

es probable que quieren netcat's "-d" option, que dice que no lee desde STDIN.

6

Puedo confirmar que -d ayudará a Netcat a ejecutarse en segundo plano.

que estaba viendo el mismo problema con:

nc -ulk 60001 | nc -lk 60002 & 

Cada vez me preguntó el jobs, la entrada de la tubería se detendría.

Cambiar el comando en el siguiente lo arreglen:

nc -ulkd 60001 | nc -lk 60002 & 
1

Tengo que usar un netcat que no tiene la opción -d.

"echo -n | netcat ... &" parece ser una solución efectiva: es decir, cierre la entrada estándar a netcat inmediatamente si no necesita usarla.

0

Como todavía no era realmente respondió, si se utiliza la opción -d Busybox y no está disponible, el siguiente comando netcat mantener "vivo" cuando se envían a fondo:

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

netcat < /dev/null y echo -n | netcat no funcionaba para mi.

Cuestiones relacionadas