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