-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
82 lines (70 loc) · 2.29 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// index.js
const fs = require('fs');
const path = require('path');
const { main } = require('./src/main');
const logger = require('./src/utils/logger');
const { safeStringify } = require('./src/utils/helpers');
const lockFile = path.join(__dirname, 'app.lock');
function acquireLock() {
try {
// Проверяем, существует ли файл блокировки
if (fs.existsSync(lockFile)) {
const pid = fs.readFileSync(lockFile, 'utf8');
// Проверяем, запущен ли процесс с этим PID
try {
process.kill(parseInt(pid), 0);
logger.warn(`Another instance is already running with PID ${pid}`);
return false;
} catch (e) {
// Если процесс не существует, удаляем старый файл блокировки
logger.warn('Stale lock file found. Removing it.');
fs.unlinkSync(lockFile);
}
}
// Создаем новый файл блокировки
fs.writeFileSync(lockFile, process.pid.toString(), { flag: 'wx' });
return true;
} catch (err) {
logger.error('Error acquiring lock:', safeStringify(err));
return false;
}
}
function releaseLock() {
try {
if (fs.existsSync(lockFile)) {
const pid = fs.readFileSync(lockFile, 'utf8');
if (pid === process.pid.toString()) {
fs.unlinkSync(lockFile);
logger.info('Lock file removed');
}
}
} catch (err) {
logger.error('Error releasing lock:', safeStringify(err));
}
}
logger.info('Starting application...');
if (acquireLock()) {
main().catch((error) => {
logger.error('Unhandled error in main function:', safeStringify(error));
});
} else {
logger.warn('Exiting due to another instance running');
process.exit(0);
}
process.on('SIGINT', () => {
logger.info('SIGINT received. Shutting down...');
releaseLock();
process.exit(0);
});
process.on('SIGTERM', () => {
logger.info('SIGTERM received. Shutting down...');
releaseLock();
process.exit(0);
});
process.on('uncaughtException', (error) => {
logger.error('Uncaught Exception:', safeStringify(error));
});
process.on('unhandledRejection', (reason, promise) => {
logger.error('Unhandled Rejection at:', safeStringify(promise));
logger.error('Reason:', safeStringify(reason));
});