如果DNS解析正在进行,Node.js进程将在SIGTERM上挂起

时间:2015-04-11 23:41:14

标签: node.js dns signals gethostbyname

我在Linux上使用节点10.38(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 个答案:

答案 0 :(得分:0)

gethostbyname确实可以被信号中断,但是您会在堆栈跟踪的底部看到正在线程内进行调用。

您发送的SIGTERM仅被发送到主程序,并且由于我尚未建立该过程的原因在所有线程完成其工作之前不会退出。