Ponizsze odnosi się przede wszystkim do skryptów Ruby zaprojektowane do działania jako CLIS; Zwykle po prostu CLI muszą zakończyć cicho z określonym kodem wyjścia po otrzymaniu SIGPIPE
; w przypadku skryptów, które wymagają indywidualnej obsługi SIGPIPE
, należy rozważyć donovan.lampa's helpful answer.
celu uzupełnienia wallyk's helpful answer i tokland's helpful answer:
Jeśli chcesz skrypt do eksponatu domyślnego systemu zachowanie, jak większości narzędzi uniksowych (np cat
) zrobić, użyj
Signal.trap("SIGPIPE", "SYSTEM_DEFAULT")
na początku skryptu.
Teraz, gdy skrypt odbiera sygnał SIGPIPE
(w systemach uniksowych), domyślne zachowanie systemu będą:
- cicho zakończyć skrypt
- raport kod wyjścia
141
(co jest obliczany jako 128
(wskazujący na zakończenie przez sygnał) + 13
(SIGPIPE
's numer))
W przeciwieństwie do tego, Signal.trap("PIPE", "EXIT")
wyświetli kod wyjścia 0
.
Należy zauważyć, że w powłoki kontekście kod wyjścia często nie jest widoczne w poleceniu takich jak ruby examble.rb | head
, ponieważ powłoka (domyślnie) informuje tylko kod opuścić ostatni dowództwa.
W bash
można sprawdzić ${PIPESTATUS[@]}
, aby wyświetlić kody wyjścia wszystkie polecenia w potoku.
w rzeczywistości ten kod jest dla żądania http. czy to znaczy, że serwer nie jest podłączony w tym momencie? wydaje się, że dzieje się to przypadkowo. – sepiroth
Nie wiem zbyt wiele na temat ruby, ale EPIPE może być rozłączeniem sieci. W Linuksie spodziewam się błędu: ENETRESET, ECONNABORTED, ECONNRESET, ENOTCONN lub ESH DOWNDOWN dla tego warunku. – wallyk
@ semiroth: 'EPIPE' jest zdefiniowany przez _system_; jest to kod wyjścia zgłoszony przez wywołanie systemowe, które wyzwoliło sygnał 'SIGPIPE', co zwykle oznacza, że proces na końcu _readinga _pipe_ został zakończony (podczas gdy _pisujący_ koniec nadal próbuje zapisać do potoku); dodatkowo, w kontekście _network_, [this] (https://www.gnu.org/software/libc/manual/html_mono/libc.html#Operation-Error-Signals) stwierdza: "Inną przyczyną' SIGPIPE' jest przy próbie wyprowadzenia na _socket_, który nie jest połączony. Patrz [Wysyłanie danych] (https://www.gnu.org/software/libc/manual/html_mono/libc.html#Sending-Data) ". – mklement0