我有一个 NodeJS 应用程序,它设置了一个 UNIX 套接字来公开一些进程间通信通道(某种监视的东西)。UNIX-socket 文件放置在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。当永远这样做restartall时,它使用 aSIGKILL来终止所有子进程。SIGKILL无法由进程处理,因此我的应用程序在没有任何关闭程序的情况下死亡。
问题是使用时未删除的套接字文件SIGKILL。子进程重启后,新服务器无法启动,因为listen调用会EADDRINUSE报错。
我无法在应用程序启动过程中删除现有的套接字文件,因为'我不知道它是真正工作的套接字还是以前不干净关闭的一些痕迹。
所以,问题是......处理这种情况的更好方法是什么(SIGKILL 和 UNIX-socket 服务器)?