Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.09.2021, 22:40
Новичок на форуме
Отправить личное сообщение для Ulibka Посмотреть профиль Найти все сообщения от Ulibka
 
Регистрация: 15.09.2021
Сообщений: 2

Как правильно завершить работу с помощью 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);
Ответить с цитированием
  #2 (permalink)  
Старый 16.09.2021, 00:06
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

process.emit('SIGTERM'')
попробуйте
В доках написано
The process object is an instance of EventEmitter.
Значит вы можете слать свои сообщения подписчикам используя emit
Ответить с цитированием
  #3 (permalink)  
Старый 16.09.2021, 08:12
Новичок на форуме
Отправить личное сообщение для Ulibka Посмотреть профиль Найти все сообщения от Ulibka
 
Регистрация: 15.09.2021
Сообщений: 2

Большое спасибо за ответ!

Написал:
process.emit('SIGTERM');

Событие конечно отловилось и действие произошло, но сам скрипт при этом не завершился.

process.exit(1) и
process.kill(process.pid, 'SIGTERM');

приводят к немедленному синхронному завершению скрипта без ожидания асинхронных операций (например закрытия файла)

Есть ли способ прекращения работы скрипта с ожиданием асинхронных операций ?

Я имею ввиду - что я, например посылаю:
process.emit('SIGTERM');
Сообщение обрабатывается листенерами и только по завершении обработки листенеров мне бы хотелось вызвать process.exit
Ответить с цитированием
  #4 (permalink)  
Старый 16.09.2021, 10:51
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Ulibka,
попробуйте так
setTimeout(_ => {
    process.emit('beforeExit');
    process.emit('SIGTERM');
    process.exit(0);
}, 2000);

вам нужно закрывать файл принудительно logger.close();
у logger естьсобытие finish может пригодится
logger.on('finish', function () {
   console.log('finish event')
})
Ответить с цитированием
  #5 (permalink)  
Старый 16.09.2021, 12:37
Аватар для ksa
ksa ksa на форуме
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от Ulibka
Есть ли способ прекращения работы скрипта с ожиданием асинхронных операций ?
Как вариант...
- При получении сообщения, просто давать команды на "закрытие всего"
- При закрытии каждого процесса (в его событии) проверять "все ли закрылись"
- Если закрылись все процессы, заканчивать работу
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как с помощью скрипта высчитать ширину полосы прокрутки? LADYX Элементы интерфейса 35 13.11.2017 12:50
Как правильно получить и присвоить данные полученные из сервера Axios, react-redux hambat Общие вопросы Javascript 5 07.03.2017 17:09
Как правильно настроить очерёдность выполнения функций? Altai Общие вопросы Javascript 8 01.02.2017 19:32
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Как правильно очистить maxlength в input? Маэстро Events/DOM/Window 10 22.06.2011 18:14