我在 Linux(Ubuntu 4.10、FC20 等)上使用节点 10.38。
我在启动中有一些代码,如下所示:
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.