Процесс 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 то, что вы отправляете, доставляется только в основную программу, и по причинам, которые я еще не установил, процесс не завершается, пока все потоки не завершат свою работу.

Другие вопросы по тегам