Sau đây chủ yếu áp dụng cho các kịch bản của Ruby được thiết kế để hoạt động như CLIs; CLI thường chỉ cần chấm dứt lặng lẽ với mã thoát cụ thể khi nhận được SIGPIPE
; đối với các tập lệnh yêu cầu xử lý từng trường hợp SIGPIPE
, hãy xem xét donovan.lampa's helpful answer.
Để bổ sung wallyk's helpful answer và tokland's helpful answer:
Nếu bạn muốn kịch bản của bạn triển lãm của hệ thống mặc định hành vi, như nhất tiện ích Unix (ví dụ, cat
) làm, sử dụng
Signal.trap("SIGPIPE", "SYSTEM_DEFAULT")
ở đầu tập lệnh của bạn.
Bây giờ, khi kịch bản của bạn nhận được tín hiệu SIGPIPE
(trên các hệ thống Unix-like), hành vi mặc định của hệ thống sẽ:
- lặng lẽ chấm dứt kịch bản của bạn
- báo cáo exit code
141
(mà được tính là 128
(cho biết chấm dứt bằng tín hiệu) + 13
(SIGPIPE
's số))
Ngược lại, Signal.trap("PIPE", "EXIT")
sẽ báo cáo mã thoát 0
.
Lưu ý rằng trong một vỏ bối cảnh mã lối ra thường là không rõ ràng trong một lệnh như ruby examble.rb | head
, bởi vì vỏ (theo mặc định) chỉ báo cáo mã thoát các cuối cùng lệnh của.
Trong bash
, bạn có thể kiểm tra ${PIPESTATUS[@]}
để xem mã thoát của tất cả các lệnh trong đường dẫn.
thực sự, mã này là tất cả cho một yêu cầu http. điều đó có nghĩa là máy chủ không được kết nối vào thời điểm đó? điều này dường như xảy ra ngẫu nhiên. – sepiroth
Tôi không biết nhiều về ruby, nhưng EPIPE có thể là một sự ngắt kết nối mạng. Trên Linux, tôi mong đợi lỗi sẽ là ENETRESET, ECONNABORTED, ECONNRESET, ENOTCONN hoặc ESHUTDOWN cho điều kiện đó. – wallyk
@sepiroth: 'EPIPE' được _system_ xác định; đó là mã thoát được báo cáo bởi một cuộc gọi hệ thống đã kích hoạt tín hiệu 'SIGPIPE', thường chỉ ra rằng quá trình tại đầu _reading_ của _pipe_ đã thoát (trong khi đầu _writing_ vẫn cố ghi vào đường ống); ngoài ra, trong ngữ cảnh _network_, [this] (https://www.gnu.org/software/libc/manual/html_mono/libc.html#Operation-Error-Signals) tuyên bố: "Nguyên nhân khác của' SIGPIPE' là khi bạn cố gắng xuất ra một _socket_ không được kết nối. Xem [Gửi dữ liệu] (https://www.gnu.org/software/libc/manual/html_mono/libc.html#Sending-Data) ". – mklement0