2016-11-20 4 views
2

У нас есть узел node.js/express/socket.io, который управляется Upstart. Сервер остановлен, выполнив эту команду в Баш: «стоп nodejs», где nodejs является Upstart скрипт следующего содержания:Очистка в node.js перед выходом

#!upstart 
description "node.js" 

# Start the job 
start on runlevel [2345] 

# Stop the job 
stop on runlevel [016] 

# Restart the process if it dies 
respawn 

script 
    cd /var/www/node_server/ 
    exec /usr/local/node/bin/node /var/www/node_server/chatserver.js >> /var/www/node_server/chatserver.log 2>&1 
end script 

post-start script 
    # Optionally put a script here that will notify you node has (re)started 
    # /root/bin/hoptoad.sh "node.js has started!" 
end script 

Мы хотели бы, чтобы выполнить некоторую работу по очистке перед сервер остановлен как упомянутое выше. Мы попробовали оба process.on ('exit' ...) и process.on ('SIGINT' ...), но безрезультатно.

Как вызвать обратный вызов до того, как сервер остановлен?

+0

вы можете уточнить 'остановить nodejs', куда вы бежите, что? как вы его запускаете? – Bamieh

+0

Да. См. Мое новое редактирование. –

ответ

1

После погружения в Документах, выскочка выстреливает SIGTERM сигнал завершения программы: http://upstart.ubuntu.com/cookbook/#stopping-a-job

поэтому вы слушаете этот сигнал с помощью узла: https://nodejs.org/api/process.html#process_signal_events

SIGTERM не поддерживается на Windows, его можно слушать.

короткий пример:

// Begin reading from stdin so the process does not exit. 

process.stdin.resume(); 

// listen to the event 

process.on('SIGTERM',() => { 
    console.log('some cleanup here'); 
}); 

Это должно сделать работу.

Кроме того, у вас есть событие выскочки pre-stop, которое можно закрыть узлом вручную перед закрытием службы, чтобы обеспечить правильное закрытие узла.

http://upstart.ubuntu.com/cookbook/#pre-stop

+1

Это работает! Благодарю. –

Смежные вопросы