我有一个NodeJS应用程序,它设置了一个UNIX套接字以暴露一些进程间通信通道(某种监视功能)。UNIX套接字文件放置在os.tmpdir()
文件夹中(即/tmp/app-monitor.sock
)。
var net = require('net');
var server = net.createServer(...);
server.listen('/tmp/app-monitor.sock', ...);
我使用信号处理(SIGINT、SITERM等)来优雅地关闭我的服务器并删除套接字文件。
function shutdown() {
server.close(); // socket file is automatically removed here
process.exit();
}
process.on('SIGINT', shutdown);
// and so on
我的应用程序正在使用 forever start ...
命令来监控其生命周期。
我有一个问题需要解决,就是当我执行 forever restartall
命令时。由于该命令使用 SIGKILL
信号终止所有子进程,因此无法通过任何关闭程序的过程来关闭我的应用程序。
问题在于,当使用 SIGKILL
信号时,某些套接字文件并未删除。在子进程重新启动后,新服务器无法启动,因为 listen
调用会导致 EADDRINUSE
错误。
我无法在应用程序启动期间删除现有的套接字文件,因为我不知道它是否是实际工作的套接字,还是之前未清理干净的痕迹。
那么,如何更好地处理这种情况(SIGKILL 和 UNIX 套接字服务器)呢?
SIGTERM
信号。 - mpen