Ho un processo java che stampa molto testo. A volte voglio solo vedere un po 'del testo. Con i programmi normali posso solo fare:Come faccio a ottenere java per uscire quando si esegue il pipe to head
$ myprog | head
mi limiterò a vedere 10 linee di uscita da myprog e sarà uscire immediatamente. Ma con java, se faccio:
$ java MyClass | head
ottengo le prime 10 linee di produzione, ma il processo di Java non uscirà fino a quando è fatto con tutta la sua elaborazione. È come se java non si preoccupasse del fatto che stdout (System.out) non c'è più e che il processo head head è morto e sparito.
Tutti gli altri programmi sia uscita in silenzio, come il gatto:
$ cat /etc/group | head
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
o uscire con un tubo rotto errore/eccezione, come il pitone:
$ python -c 'while True: print "hi"' | head
hi
hi
hi
hi
hi
hi
hi
hi
hi
hi
Traceback (most recent call last):
File "<string>", line 1, in <module>
IOError: [Errno 32] Broken pipe
Come si può ottenere java per sollevare un'eccezione quando chiamando System.out.println() quando eseguo il pipe di output su qualcosa come head? Mi piacerebbe essere in grado di fare qualcosa di simile:
try {
while(true) {
System.out.println("hi");
}
} catch(BrokenPipeException e) {
// exit gracefully
}
SIGPIPE viene inviato al processo java in questo caso, ma non sono sicuro di cosa faccia java con esso. Se si potesse verificare se la JVM ha ricevuto un sigpipe e morire, dovrebbe funzionare. –
Java fa cose speciali con i segnali e so da altri problemi che è quasi impossibile impostare un programma java fino a intercettare i segnali. – onlynone