0

我在 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.
4

1 回答 1

0

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

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

于 2015-04-14T15:27:20.880 回答