我有一个 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 服务器)?