Как правильно завершить работу с помощью SIGTERM ?
Нужно завершать работу скрипта на Node (изнутри самого скрипта) таким образом, чтобы закрывался logger.
Тестовый код ниже. Можно ли как то послать сигнал SIGTERM самому себе ? В примере который я написал приложение просто закрывается и слушатели SIGTERM и beforeClose не срабатывают Можно ли как то завершить приложение из самого приложения чтобы сработал слушатель SIGTERM (собственно мне надо только дождаться выполнения logger.close() ) import fs from 'fs'; import path from 'path'; const fname = path.resolve(__dirname, '../../', 'pipser.log'); console.log('-- LOGER START ---'); console.log(fname); export const logger = fs.createWriteStream(fname, { flags: 'a', // 'a' means appending (old data will be preserved) }); logger.write('some data'); // append string to your file logger.write('more data'); // again logger.write('and more'); // again // logger.end(); // close string process.on('SIGTERM', () => { console.log('Logger CLOSED'); logger.close(); }); process.on('beforeExit', () => { console.log('Logger CLOSED before'); logger.close(); }); setInterval(() => { console.log('tick'); }, 500); setTimeout(() => { process.kill(process.pid, 'SIGTERM'); }, 2000); |
process.emit('SIGTERM'')
попробуйте В доках написано The process object is an instance of EventEmitter. Значит вы можете слать свои сообщения подписчикам используя emit |
Большое спасибо за ответ!
Написал: process.emit('SIGTERM'); Событие конечно отловилось и действие произошло, но сам скрипт при этом не завершился. process.exit(1) и process.kill(process.pid, 'SIGTERM'); приводят к немедленному синхронному завершению скрипта без ожидания асинхронных операций (например закрытия файла) Есть ли способ прекращения работы скрипта с ожиданием асинхронных операций ? Я имею ввиду - что я, например посылаю: process.emit('SIGTERM'); Сообщение обрабатывается листенерами и только по завершении обработки листенеров мне бы хотелось вызвать process.exit |
Ulibka,
попробуйте так setTimeout(_ => { process.emit('beforeExit'); process.emit('SIGTERM'); process.exit(0); }, 2000); вам нужно закрывать файл принудительно logger.close(); у logger естьсобытие finish может пригодится logger.on('finish', function () { console.log('finish event') }) |
Цитата:
- При получении сообщения, просто давать команды на "закрытие всего" - При закрытии каждого процесса (в его событии) проверять "все ли закрылись" - Если закрылись все процессы, заканчивать работу |
Часовой пояс GMT +3, время: 04:12. |