Child processes are now terminated when the parent process dies. This means that if the main mailtrain process gets killed, there are no processes which remain running.

This commit is contained in:
Tomas Bures 2019-05-25 21:57:11 +02:00
parent 1270ca71f8
commit fcd2a61b65
14 changed files with 48 additions and 18 deletions

View file

@ -38,17 +38,6 @@ if (config.title) {
process.title = config.title;
}
/*
const cleanExit = () => process.exit();
process.on('SIGINT', cleanExit); // catch ctrl-c
process.on('SIGTERM', cleanExit); // catch kill
process.on('exit', function() {
// TODO
});
*/
async function startHTTPServer(appType, appName, port) {
const app = await appBuilder.createApp(appType);
app.set('port', port);

View file

@ -1,7 +1,7 @@
'use strict';
const config = require('config');
const fork = require('child_process').fork;
const fork = require('./fork').fork;
const log = require('./log');
const path = require('path');
const fs = require('fs-extra')

View file

@ -1,6 +1,6 @@
'use strict';
const fork = require('child_process').fork;
const fork = require('./fork').fork;
const log = require('./log');
const path = require('path');
const bluebird = require('bluebird');

View file

@ -1,6 +1,6 @@
'use strict';
const fork = require('child_process').fork;
const fork = require('./fork').fork;
const log = require('./log');
const path = require('path');
const senders = require('./senders');

31
server/lib/fork.js Normal file
View file

@ -0,0 +1,31 @@
'use strict';
const builtinFork = require('child_process').fork;
const cleanExit = () => process.exit();
process.on('SIGINT', cleanExit); // catch ctrl-c
process.on('SIGTERM', cleanExit); // catch kill
const children = [];
process.on('message', msg => {
if (msg === 'exit') {
cleanExit();
}
});
process.on('exit', function() {
for (const child of children) {
child.send('exit');
}
});
function fork(path, args, opts) {
const child = builtinFork(path, args, opts);
children.push(child);
return child;
}
module.exports.fork = fork;

View file

@ -1,7 +1,7 @@
'use strict';
const knex = require('./knex');
const fork = require('child_process').fork;
const fork = require('./fork').fork;
const log = require('./log');
const path = require('path');
const {ImportStatus, RunStatus} = require('../../shared/imports');

View file

@ -1,6 +1,6 @@
'use strict';
const fork = require('child_process').fork;
const fork = require('./fork').fork;
const log = require('./log');
const path = require('path');
const knex = require('./knex');

View file

@ -6,7 +6,7 @@
const config = require('config');
const reportHelpers = require('../lib/report-helpers');
const fork = require('child_process').fork;
const fork = require('../lib/fork').fork;
const path = require('path');
const log = require('../lib/log');
const fs = require('fs');

View file

@ -8,6 +8,7 @@ const { CampaignType, CampaignStatus, CampaignSource } = require('../../shared/c
const util = require('util');
const campaigns = require('../models/campaigns');
const contextHelpers = require('../lib/context-helpers');
require('../lib/fork');
const { tLog } = require('../lib/translate');

View file

@ -17,6 +17,7 @@ const shares = require('../models/shares');
const { tLog } = require('../lib/translate');
const {ListActivityType} = require('../../shared/activity-log');
const activityLog = require('../lib/activity-log');
require('../lib/fork');
const csvparse = require('csv-parse');

View file

@ -1,7 +1,7 @@
'use strict';
const config = require('config');
const fork = require('child_process').fork;
const fork = require('../lib/fork').fork;
const log = require('../lib/log');
const path = require('path');
const knex = require('../lib/knex');
@ -11,6 +11,7 @@ const campaigns = require('../models/campaigns');
const builtinZoneMta = require('../lib/builtin-zone-mta');
const {CampaignActivityType} = require('../../shared/activity-log');
const activityLog = require('../lib/activity-log');
require('../lib/fork');
let messageTid = 0;

View file

@ -5,6 +5,7 @@ const log = require('../lib/log');
const mailers = require('../lib/mailers');
const CampaignSender = require('../lib/campaign-sender');
const {enforce} = require('../lib/helpers');
require('../lib/fork');
const workerId = Number.parseInt(process.argv[2]);
let running = false;

View file

@ -12,6 +12,7 @@ const knex = require('../../../lib/knex');
const contextHelpers = require('../../../lib/context-helpers');
const {renderCsvFromStream} = require('../../../lib/report-helpers');
const stream = require('stream');
require('../../../lib/fork');
async function main() {
try {

View file

@ -10,5 +10,10 @@ module.exports.init = (app, done) => {
type: 'zone-mta-started'
});
process.on('message', msg => {
if (msg === 'exit') {
process.exit(); }
});
done();
};