Процесс Node.js зависает на SIGTERM, если выполняется разрешение DNS
Я использую узел 10.38 в Linux (Ubuntu 4.10, FC20 и т. Д.).
У меня есть некоторый код при запуске, который выглядит следующим образом:
process.on('SIGTERM', function() {
process.exit(1);
});
process.on('SIGINT', function() {
process.exit(1);
});
Где-то еще в процессе, у меня есть такой код:
dns.lookup("somehostname", function(err, addresses, family) {
// do something
});
Много раз, если вы отправляете SIGTERM процессу, узел не будет выходить. Он будет зависать столько, сколько потребуется для разрешения DNS. Иногда, если DNS-сервер не отвечает, это может занять до 5 минут. Если в это время вы берете трассировку стека GDB, вы видите трассировку стека, подобную этой. Если вы присоедините отладчик gdb, вы увидите, что он застрял в попытке разрешить имя хоста, которое мы пытаемся разрешить.
Я бы подумал, что gethostbyname может быть прервано сигналами. Может кто-нибудь пролить на это понимание?
Thread 3 (process 18074):
#0 0x00007fabac3bed26 in poll () from /lib64/libc.so.6
No symbol table info available.
#1 0x00007fababcdce90 in __libc_res_nsend () from /lib64/libresolv.so.2
No symbol table info available.
#2 0x00007fababcdbcb6 in __libc_res_nquery () from /lib64/libresolv.so.2
No symbol table info available.
#3 0x00007fababcdbf27 in __libc_res_nquerydomain () from /lib64/libresolv.so.2
No symbol table info available.
#4 0x00007fababcdc14b in __libc_res_nsearch () from /lib64/libresolv.so.2
No symbol table info available.
#5 0x00007fababeeb8ef in _nss_dns_gethostbyname3_r () from
/lib64/libnss_dns.so.2
No symbol table info available.
#6 0x00007fababeebb64 in _nss_dns_gethostbyname2_r () from
/lib64/libnss_dns.so.2
No symbol table info available.
#7 0x00007fabac3b02bf in gaih_inet () from /lib64/libc.so.6
No symbol table info available.
#8 0x00007fabac3b178e in getaddrinfo () from /lib64/libc.so.6
No symbol table info available.
#9 0x0000000000a0cbb2 in uv_getaddrinfo ()
No symbol table info available.
#10 0x0000000000a127c4 in uv_queue_work ()
No symbol table info available.
#11 0x0000000000a08462 in uv_thread_create ()
No symbol table info available.
1 ответ
gethostbyname
действительно могут быть прерваны сигналами, но в нижней части стека вы увидите, что вызов выполняется внутри потока.
SIGTERM
то, что вы отправляете, доставляется только в основную программу, и по причинам, которые я еще не установил, процесс не завершается, пока все потоки не завершат свою работу.