2012-07-25 19 views
5

Tengo que hacer un programa java que cuando el usuario ingrese 0 debe salir. no hay problema escribiendo en código Java.proceso en segundo plano en java escuchando stdin

int cmd = read(); 
System.out.println("got command : " + cmd); 
if (cmd == 48) { // ASCII code for 0 
System.exit(0); 

Quiero ejecutar este proceso utilizando el script start-stop en linux. También estoy siendo capaz de hacer que el uso de & o nohup

case "$1" in  
    'start') 
    if [ -f myfifo ]; then 
     rm myfifo 
    fi 
    mkfifo myfifo 
    cat > myfifo & 
    echo $! > myfifo-cat-pid 
    java -jar myjar.jar >/dev/null 2>&1 0<myfifo & 
    echo "Started process: "$! 
    ;; 

    'stop') 
    echo 0 > myfifo 
    echo "Stopped process: " 
    rm myfifo 
    ;; 
esac 

Mi problema es tan pronto como funciono con este proceso se lee la entrada -1. Aunque quiero leer de stdinput cuando algo se repite explícitamente, es decir, se llama a stop. Simplemente necesito un programa que se cierre por script de shell de forma explícita. Lo he intentado mucho. Ayuadame.

Editar:

sólo quiero cerrar el programa cuando el usuario pulse Q o cualquier evento y no quiero bucle infinito en el código. Cualquier otro enfoque como escuchar otros eventos también ayudará si es posible. Mi código no debería ser una encuesta para el evento. He intentado Jnotify mirar un directorio y levantar un evento cuando el archivo se crea o elimina en ese directorio. Pero, mala suerte, no tienen soporte para SunOS. :(

+0

How di you read values? – poussma

+0

usando System.in.read(); También lo he intentado usando BufferReader –

+0

hum ... ¿Estás seguro de que el myfifo existe y contiene algo allí? System.in.read() está diseñado para funcionar bien ... ¿qué significa 'mkfifo'? – poussma

Respuesta

0

Si utiliza set -m en la parte superior de su script de shell (por lo tanto permitiendo la fuerza el control de trabajos), debería ver un comportamiento coherente.

1

Dado que no tiene datos en la tubería sin embargo, read() ve el final de la secuencia y debido a esto se vuelve -1. Llame available() antes de la lectura de la corriente para asegurarse de que no hay información en el mismo.

3

Bueno, de hecho, los archivos fifo parece que no se comportan exactamente como te imaginas

El comando read() no está bloqueando en una tubería debe bucle hasta que obtener datos:..

try { 
     bis = new BufferedInputStream(System.in); 
     while (true) { 
      byte[] buffer = new byte[4096]; 
      if (bis.available() > 0) { 
       bis.read(buffer, 0, bis.available()); 
       // do some clever thing 
      } else { 
       try { 
        Thread.sleep(50); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } catch (IOException e) { 
     // it failed... 
    } 

Esto intentará leer y si no hay nada, esperará durante 50 ms.

M.

+0

Se me olvida mencionar que también he hecho esto usando while loop pero luego leerá continuamente de stdin que no quiero porque es un bucle infinte hasta que el usuario envíe comando correcto :( –

+0

¿Cuál es tu necesidad? ¿Hacer algo en tu programa y escuchar el stdin al mismo tiempo? ¿Y cuando el usuario presiona "q" detiene tu programa? – poussma

+0

sí, eso es lo que necesito. Pero el programa debería ejecutarse en segundo plano –

0

Cuando procesa un comando en un script, el stdin de ese comando se redirige implícitamente desde /dev/null.

# test by executing a script with ... 
- cat > myfifo & lsof -p $! 
+ cat 0<&0 > myfifo & lsof -p $! 
Cuestiones relacionadas