Lo siguiente se aplica principalmente a los scripts de Ruby diseñados para actuar como CLI; Las CLI generalmente solo necesitan finalizar silenciosamente con un código de salida específico al recibir SIGPIPE
; para las secuencias de comandos que requieren el manejo caso por caso de SIGPIPE
, considere donovan.lampa's helpful answer.
Para complementar wallyk's helpful answer y tokland's helpful answer:
Si desea que su script para exhibición del sistema por defecto comportamiento, como mayoría de las utilidades de Unix (por ejemplo, cat
) hacer, utilice
Signal.trap("SIGPIPE", "SYSTEM_DEFAULT")
al comienzo de su secuencia de comandos.
Ahora, cuando el script recibe la señal SIGPIPE
(en sistemas tipo Unix), el comportamiento predeterminado del sistema:
- silencio terminar su script
- informe código de salida
141
(que se calcula como 128
(indicando la terminación por señal) + 13
(SIGPIPE
's número))
Por el contrario, Signal.trap("PIPE", "EXIT")
informará el código de salida 0
.
Tenga en cuenta que en una cáscara de contexto, el código de salida a menudo no es evidente en un comando como ruby examble.rb | head
, porque el shell (por defecto) sólo reporta el código de salida del comando última.
En bash
, puede examinar ${PIPESTATUS[@]}
para ver los códigos de salida de todos los comandos en la tubería.
en realidad, este código es todo para una solicitud http. ¿Eso solo significa que el servidor no está conectado en ese punto? esto parece estar sucediendo al azar. – sepiroth
No sé mucho sobre ruby, pero EPIPE podría ser una desconexión de red. En Linux, esperaría que el error fuera ENETRESET, ECONNABORTED, ECONNRESET, ENOTCONN o ESHUTDOWN para esa condición. – wallyk
@sepiroth: 'EPIPE' está _system_-defined; es el código de salida informado por una llamada al sistema que activó la señal 'SIGPIPE', que típicamente indica que el proceso en _reading_ end de _pipe_ ha salido (mientras que _writing_ end aún está intentando escribir en la tubería); adicionalmente, en un contexto _network_, [this] (https://www.gnu.org/software/libc/manual/html_mono/libc.html#Operation-Error-Signals) declara: "Otra causa de' SIGPIPE' es cuando intentas enviar a un _socket_ que no está conectado. Ver [Enviar datos] (https://www.gnu.org/software/libc/manual/html_mono/libc.html#Sending-Data) ". – mklement0