Tengo un proceso de Java que imprime una gran cantidad de texto. A veces solo quiero ver un poco del texto. Con los programas normales que sólo puede hacer:¿Cómo puedo obtener Java para salir cuando se conecta a la cabeza
$ myprog | head
Voy a ver 10 líneas de salida de miprog y que va a salir de inmediato. Pero con java, si lo hago:
$ java MyClass | head
puedo obtener las primeras 10 líneas de salida, pero el proceso java no saldrá hasta que se hace con toda su procesamiento. Es como si a java no le importara que stdout (System.out) se hubiera ido y el proceso de la cabeza haya desaparecido.
Todos los demás programas, ya sea la salida en silencio, como gato:
$ 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 salida con un roto tubería de error/excepción, como Python:
$ 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
¿Cómo se puede conseguir java para elevar una excepción cuando llamando a System.out.println() cuando canalizo la salida a algo como head? Me encantaría ser capaz de hacer algo como:
try {
while(true) {
System.out.println("hi");
}
} catch(BrokenPipeException e) {
// exit gracefully
}
SIGPIPE se envía al proceso de Java en este caso, pero no estoy seguro de lo que Java hace con él. Si pudieras verificar si la JVM recibió un sello y morir, debería funcionar. –
Java hace cosas especiales con señales y sé por otros problemas que es casi imposible configurar un programa Java para atrapar señales. – onlynone