У меня есть приложение 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
. Когда навсегда выполняется restartall
, он использует SIGKILL
для завершения всех дочерних процессов. SIGKILL
не может обрабатываться процессом, поэтому мое приложение умирает без каких-либо процедур выключения.
Проблема заключается в файле сокета, который не удаляется при использовании SIGKILL
. После перезапуска дочернего процесса новый сервер не может быть запущен, так как вызов "a listen
вызывает ошибку EADDRINUSE
.
Я не могу удалить существующий файл сокета во время запуска приложения. "Я не знаю, действительно ли это настоящий рабочий сокет или некоторые следы предыдущего нечистого отключения.
Итак, вопрос в том, что... Каков лучший способ справиться с такой ситуацией (сервер SIGKILL и UNIX-сокетов)?