2012-07-25 10 views
5

Ich muss ein Java-Programm machen, dass, wenn Benutzer 0 eingibt, sollte es beenden. Kein Problem beim Schreiben in Java-Code.Hintergrundprozess in Java Anhören stdin

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

Ich möchte diesen Prozess mit Start-Stop-Skript in Linux ausführen. Ich bin in der Lage zu tun, dass & oder 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 

Mein Problem besteht darin, so schnell wie ich diesen Prozess führen Sie es Eingang lesen -1. Während ich von stdinput lesen möchte, wenn etwas explizit dazu gehört, d. H. Stop wird aufgerufen. Ich brauche einfach ein Programm, das explizit vom Shell-Skript geschlossen wird. Ich habe mich bemüht. Hilf mir.

Edit:

Ich will nur das Programm schließen, wenn der Benutzer drücken Sie q oder eine solche Veranstaltung und wollen in Code Endlosschleife nicht. Jeder andere Ansatz wie das Hören anderer Ereignisse wird auch helfen, wenn möglich. Mein Code sollte nicht nach Ereignissen abgefragt werden. Ich habe versucht Jnotify, die ein Verzeichnis beobachten und ein Ereignis auslösen, wenn eine Datei in diesem Verzeichnis erstellt oder gelöscht wird. Aber glücklicherweise haben sie keine Unterstützung für SunOS. :(

+0

Wie lesen Sie Werte? – poussma

+0

mit System.in.read(); Auch ich habe es versucht, mit BufferReader –

+0

hum ... Sind Sie sicher, dass die myfifo existiert und enthält alles drin? System.in.read() soll gut funktionieren ... was macht das 'mkfifo'? – poussma

Antwort

0

Wenn Sie set -m an der Spitze des Shell-Skript verwenden (daher ermöglicht gewaltsam Steuerungsauftrag), sollten Sie ein konsistentes Verhalten sehen.

1

Da Sie keine Daten in dem Rohr noch haben, sieht read() das Ende des Stroms und aus diesem Grunde gibt es -1. available() Rufen vor aus dem Stream zu lesen um sicher zu sein, dass es darin enthaltenen Angaben.

3

Nun, in der Tat die fifo Dateien verhalten scheint nicht genau so, wie man sich vorstellen

Der read() Befehl an einem Rohr nicht blockiert Sie sollten Schleife, bis Sie Daten zu erhalten:..

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... 
    } 

Dies wird versuchen zu lesen und wenn es nichts gibt, dann wird es auf 50 ms warten.

M.

+0

Ich vergesse zu erwähnen, dass ich dies auch mit While-Schleife getan habe, aber dann wird es kontinuierlich von Stddin lesen, die ich nicht will, weil es eine Infinet-Schleife, bis Benutzer sendet richtiger Befehl. :( –

+0

Was brauchen Sie? Machen Sie etwas in Ihrem Programm und hören Sie die stdin zur gleichen Zeit? Und wenn der Benutzer "q" drücken stoppt es Ihr Programm? – poussma

+0

ja das ist was ich brauche. Aber Programm sollte im Hintergrund laufen –

0

Wenn Sie einen Befehl in einem Skript im Hintergrund ausführen, wird die stdin dieses Befehls implizit von /dev/null umgeleitet.

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