Почему Ubuntu закрывает мое приложение Delphi -1 EPIPE (Broken pipe)
Создал консольное приложение для Linux 64. 2 сервера TIdHTTPServer
, один на 80 порт другой на 443.
Иногда, может через час, может через день, в момент установления клиентом соединения, по HTTPS, появляется ошибка -1 EPIPE (Broken pipe)
и закрывается всё приложение.
лог приложения через strace -tt -i -ff -o /root/.../myApp/logs/strace.log ./myApp &>/dev/null
TIdHTTPServer:
14:01:14.855531 [00007f6b326c1345] clone(child_stack=0x7f6b2ecdefb0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tid=[621923], tls=0x7f6b2ecdf700, child_tidptr=0x7f6b2ecdf9d0) = 621923
14:01:14.855629 [00007f6b326b71eb] select(1024, [6], NULL, NULL, {tv_sec=0, tv_usec=250000}) = 1 (in [6], left {tv_sec=0, tv_usec=46360})
14:01:15.059329 [00007f6b326c232f] accept(6, {sa_family=AF_INET, sin_port=htons(60842), sin_addr=inet_addr("172.104.10.222")}, [128->16]) = 7
14:01:15.059372 [00007f6b326c24be] getsockopt(7, SOL_SOCKET, SO_TYPE, [1], [4]) = 0
14:01:15.059405 [00007f6b326c24be] getsockopt(7, SOL_TCP, TCP_NODELAY, [0], [4]) = 0
14:01:15.059429 [00007f6b326c248b] getsockname(7, {sa_family=AF_INET, sin_port=htons(443), sin_addr=inet_addr("65.109.55.147")}, [128->16]) = 0
14:01:15.059455 [00007f6b326c245b] getpeername(7, {sa_family=AF_INET, sin_port=htons(60842), sin_addr=inet_addr("172.104.10.222")}, [128->16]) = 0
14:01:15.059720 [00007f6b32585839] futex(0x7f6b18005270, FUTEX_WAKE_PRIVATE, 1) = 1
14:01:16.908028 [????????????????] +++ killed by SIGPIPE +++
TIdContext:
----такие строки добавлены из моего лога
14:01:14.855641 [00007f6b3258159a] set_robust_list(0x7f6b2ecdf9e0, 24) = 0
14:01:14.855686 [00007f6b3258c170] futex(0x7f6b18005270, FUTEX_WAIT_PRIVATE, 2, NULL) = 0
----14:01:15.059 - ServerQuerySSLPort: 443
14:01:15.061222 [00007f6b326b022c] read(7, "\26\3\1\0\346\1\0\0\342\3\3", 11) = 11
14:01:15.061256 [00007f6b326b022c] read(7, "\331U\310\263\30\270\222;k\32T\213\f\354K@$\261\335#i\2306mX\275w\335\321\307\22"..., 224) = 224
----14:01:15.061 - ServerIOHandlerStatusInfoEx: 443 AMsg: SSLv3 read client hello A
14:01:15.062424 [00007f6b326af6da] stat("/usr/local/ssl/certs/ee64a828.0", 0x7f6b2ecde4d0) = -1 ENOENT (No such file or directory)
14:01:15.062471 [00007f6b326b02cf] write(7, "\26\3\3\0005\2\0\0001\3\3\21\232\216\36\276\n)9|5\325\227&\"\236\260\7\211\332\262\262"..., 4096) = 4096
----14:01:15.062 - ServerIOHandlerStatusInfoEx: 443 AMsg: SSLv3 write server hello A
----14:01:15.062 - ServerIOHandlerStatusInfoEx: 443 AMsg: SSLv3 write certificate A
14:01:15.080571 [00007f6b326b02cf] write(7, "\362L\227\34\7?\rR\365\355\357/\202\17\2\3\1\0\1\243\201\3620\201\3570\37\6\3U\35#"..., 1849) = 1849
----14:01:15.080 - ServerIOHandlerStatusInfoEx: 443 AMsg: SSLv3 write key exchange A
----14:01:15.080 - ServerIOHandlerStatusInfoEx: 443 AMsg: SSLv3 write server done A
----14:01:15.080 - ServerIOHandlerStatusInfoEx: 443 AMsg: SSLv3 flush data
14:01:15.081151 [00007f6b326b022c] read(7, "\26\3\3\2\6", 5) = 5
----14:01:15.081 - ServerIOHandlerStatusInfoEx: 443 AMsg: SSLv3 read client certificate A
14:01:15.287303 [00007f6b326b022c] read(7, "\20\0\2\2\2\0\236\377\17o \237nM\267\277\221\16\35\315\270\31t\242\351\v\233]j\205^o"..., 518) = 518
----14:01:15.307 - ServerIOHandlerStatusInfoEx: 443 AMsg: SSLv3 read client key exchange A
----14:01:15.307 - ServerIOHandlerStatusInfoEx: 443 AMsg: SSLv3 read certificate verify A
14:01:15.308018 [00007f6b326b022c] read(7, "\24\3\3\0\1", 5) = 5
14:01:15.308031 [00007f6b326b022c] read(7, "\1", 1) = 1
14:01:15.308068 [00007f6b326b022c] read(7, "\26\3\3\0(", 5) = 5
14:01:15.308081 [00007f6b326b022c] read(7, "EMl\224\307\237\265\273c\357\260\272Dm\4M\261BE\236\352K\21\201\2632\0011uld\336"..., 40) = 40
----14:01:15.308 - ServerIOHandlerStatusInfoEx: 443 AMsg: SSLv3 read finished A
14:01:15.309270 [00007f6b326b02cf] write(7, "\26\3\3\0\252\4\0\0\246\0\0\1,\0\240++\312(\301\330\374\4\333y\345\226`E\322&\315"..., 226) = 226
----14:01:15.308 - ServerIOHandlerStatusInfoEx: 443 AMsg: SSLv3 write session ticket A
----14:01:15.308 - ServerIOHandlerStatusInfoEx: 443 AMsg: SSLv3 write change cipher spec A
----14:01:15.309 - ServerIOHandlerStatusInfoEx: 443 AMsg: SSLv3 write finished A
----14:01:15.309 - ServerIOHandlerStatusInfoEx: 443 AMsg: SSLv3 flush data
----14:01:15.309 - ServerIOHandlerStatusInfoEx: 443 AMsg: SSL negotiation finished successfully
----14:01:15.310 - ServerIOHandlerStatusInfoEx: 443 AMsg: SSL negotiation finished successfully
14:01:15.310147 [00007f6b326b71eb] select(1024, [7], NULL, NULL, {tv_sec=0, tv_usec=0}) = 0 (Timeout)
14:01:15.310301 [00007f6b326b71eb] select(1024, [7], NULL, NULL, {tv_sec=3, tv_usec=0}) = 1 (in [7], left {tv_sec=1, tv_usec=402491})
----14:01:15.310 - ServerConnect: 443
14:01:16.907866 [00007f6b326b022c] read(7, "", 5) = 0
14:01:16.907909 [00007f6b326b02cf] write(7, "\25\3\3\0\32\352\376\261\4\355\354`\366x2\f\374\\X\261\255\273\3023\354%6u\255\313\262", 31) = -1 EPIPE (Broken pipe)
14:01:16.907946 [00007f6b326b02cf] --- SIGPIPE {si_signo=SIGPIPE, si_code=SI_USER, si_pid=587964, si_uid=0} ---
14:01:16.908009 [????????????????] +++ killed by SIGPIPE +++
Код соединения, блок except никогда не срабатывает:
procedure THTTPSServer.ServerConnect(AContext: TIdContext);
begin
try
fuLog('logs\' + GetCurrentThreadID.ToString + '.txt', FormatDateTime('yyyy.mm.dd hh:nn:ss.zzz', Now) + ' - ServerConnect: ' + IntToStr(Self.DefaultPort));
if AContext.Connection.IOHandler is TIdSSLIOHandlerSocketBase then TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler).PassThrough := False;
except
on E: EIdSocketError do
begin
fuException('SERVER ERROR.' + ' - PID: ' + GetCurrentThreadID.ToString, 'ServerConnect EIdSocketError.', E);
end;
on E: EIdReadTimeout do
begin
fuException('SERVER ERROR.' + ' - PID: ' + GetCurrentThreadID.ToString, 'ServerConnect EIdReadTimeout.', E);
end;
on E: EIdConnClosedGracefully do
begin
fuException('SERVER ERROR.' + ' - PID: ' + GetCurrentThreadID.ToString, 'ServerConnect EIdConnClosedGracefully.', E);
end;
on E: EIdClosedSocket do
begin
fuException('SERVER ERROR.' + ' - PID: ' + GetCurrentThreadID.ToString, 'ServerConnect EIdClosedSocket.', E);
end;
on E: EIdHTTPProtocolException do
begin
fuException('SERVER ERROR.' + ' - PID: ' + GetCurrentThreadID.ToString, 'ServerConnect EIdException.', E);
end;
on E: EIdException do
begin
fuException('SERVER ERROR.' + ' - PID: ' + GetCurrentThreadID.ToString, 'ServerConnect EIdException.', E);
end;
on E: Exception do
begin
fuException('SERVER ERROR.' + ' - PID: ' + GetCurrentThreadID.ToString, 'ServerConnect Exception.', E);
end;
end;
end;
Ошибка всегда на этой строке
write(7, "\25\3\3\0\32\352\376\261\4\355\354`\366x2\f\374\\X\261\255\273\3023\354%6u\255\313\262", 31) = -1 EPIPE (Broken pipe)
Последнее сообщение в моём логе всегда 14:01:15.310 - ServerConnect: 443
, веду лог всех событий.
Как устранить ошибку или поймать ее у себя в коде и правильно обработать, что бы не выключалось всё приложение и сервер продолжал работать?
Ответы (1 шт):
Попробуйте поискать где у вас идёт отправка или получение данных в процедурах send (fpsend) или recv (fprecv) указать флаг MSG_NOSIGNAL (32768) . В общем, суть в том, что сокету надо указать что при этой проблеме генерить не ошибку, а отрицательный результат выполнения процедуры. Возможно в самом компоненте это как-то устанавливается, но я что-то не нашёл.