@blocklet/cli 1.16.53 → 1.16.54-beta-20251016-050817-2fc632b8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -1,7 +1,32 @@
|
|
|
1
|
-
const {
|
|
1
|
+
const { checkAndKillOrphanProcesses } = require('@abtnode/util/lib/pm2/check-orphan-processes');
|
|
2
|
+
const { DAEMON_SCRIPT_PATH, SERVICE_SCRIPT_PATH } = require('@abtnode/constant');
|
|
3
|
+
|
|
4
|
+
const { printSuccess, printError, printInfo, printWarning } = require('../../util');
|
|
2
5
|
const { getNode } = require('../../node');
|
|
3
6
|
|
|
4
7
|
exports.run = async ({ target }) => {
|
|
8
|
+
// Handle orphan-process cleanup without requiring node instance
|
|
9
|
+
if (target === 'orphan-process') {
|
|
10
|
+
printInfo('Checking for orphan daemon/service processes...');
|
|
11
|
+
|
|
12
|
+
const logger = {
|
|
13
|
+
info: (msg) => printInfo(msg),
|
|
14
|
+
warn: (msg) => printWarning(msg),
|
|
15
|
+
error: (msg) => printError(msg),
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
try {
|
|
19
|
+
await checkAndKillOrphanProcesses({ scriptName: DAEMON_SCRIPT_PATH, logger, force: true });
|
|
20
|
+
await checkAndKillOrphanProcesses({ scriptName: SERVICE_SCRIPT_PATH, logger, force: true });
|
|
21
|
+
printSuccess('Orphan process cleanup completed');
|
|
22
|
+
} catch (err) {
|
|
23
|
+
printError(`Failed to cleanup orphan processes: ${err.message}`);
|
|
24
|
+
process.exit(1);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
process.exit(0);
|
|
28
|
+
}
|
|
29
|
+
|
|
5
30
|
const { node } = await getNode({ dir: process.cwd() });
|
|
6
31
|
|
|
7
32
|
node.onReady(async () => {
|
|
@@ -117,7 +117,7 @@ module.exports = (parentCommand = '') => {
|
|
|
117
117
|
.command('cleanup')
|
|
118
118
|
.option(
|
|
119
119
|
'--target <target>',
|
|
120
|
-
'Which target to cleanup, available options: cache, maintenance-status, blacklist, blacklist-expired'
|
|
120
|
+
'Which target to cleanup, available options: cache, maintenance-status, blacklist, blacklist-expired, orphan-process'
|
|
121
121
|
)
|
|
122
122
|
.description('Do some server level cleanup work')
|
|
123
123
|
.action(parseOptions(cleanup.run));
|
|
@@ -35,6 +35,8 @@ const {
|
|
|
35
35
|
NODE_MODES,
|
|
36
36
|
MAX_NGINX_WORKER_CONNECTIONS,
|
|
37
37
|
SERVER_STATUS,
|
|
38
|
+
ORPHAN_CHECK_DELAY,
|
|
39
|
+
PROCESS_NAME_ORPHAN_CLEANUP,
|
|
38
40
|
} = require('@abtnode/constant');
|
|
39
41
|
|
|
40
42
|
const { canUseFileSystemIsolateApi, SAFE_NODE_VERSION } = require('@abtnode/util/lib/security');
|
|
@@ -694,6 +696,41 @@ const exec = async ({ workingDir, config, dataDir, mode, updateDb, forceIntranet
|
|
|
694
696
|
|
|
695
697
|
printAccessUrls(accessUrls);
|
|
696
698
|
|
|
699
|
+
// Schedule orphan process cleanup via PM2 (non-blocking)
|
|
700
|
+
try {
|
|
701
|
+
await pm2.connectAsync();
|
|
702
|
+
|
|
703
|
+
// Remove any existing cleanup process first
|
|
704
|
+
try {
|
|
705
|
+
await pm2.deleteAsync(PROCESS_NAME_ORPHAN_CLEANUP);
|
|
706
|
+
debug('Removed existing orphan cleanup process');
|
|
707
|
+
} catch (err) {
|
|
708
|
+
// Ignore if not exists
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
await pm2.startAsync({
|
|
712
|
+
name: PROCESS_NAME_ORPHAN_CLEANUP,
|
|
713
|
+
script: './lib/process/orphan-cleanup-worker.js',
|
|
714
|
+
cwd: getCliCwd(),
|
|
715
|
+
autorestart: false, // Don't restart after exit
|
|
716
|
+
max_restarts: 0, // Never restart
|
|
717
|
+
instances: 1,
|
|
718
|
+
env: {
|
|
719
|
+
...process.env,
|
|
720
|
+
ORPHAN_CHECK_DELAY: ORPHAN_CHECK_DELAY.toString(),
|
|
721
|
+
ABT_NODE_LOG_DIR: logDir,
|
|
722
|
+
},
|
|
723
|
+
});
|
|
724
|
+
|
|
725
|
+
pm2.disconnect();
|
|
726
|
+
printInfo('Orphan cleanup worker started');
|
|
727
|
+
} catch (err) {
|
|
728
|
+
// Cleanup failure should not block server start
|
|
729
|
+
pm2.disconnect();
|
|
730
|
+
debug('Failed to start orphan cleanup worker:', err);
|
|
731
|
+
printWarning('Failed to start orphan cleanup worker');
|
|
732
|
+
}
|
|
733
|
+
|
|
697
734
|
return resolve(0);
|
|
698
735
|
} catch (err) {
|
|
699
736
|
debug('start error', err);
|
package/lib/process/daemon.js
CHANGED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/* eslint-disable no-console */
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Orphan process cleanup worker (PM2 managed)
|
|
6
|
+
*
|
|
7
|
+
* This script runs as a PM2 process after server starts to clean up orphan daemon/service processes.
|
|
8
|
+
* It will automatically remove itself from PM2 after completion.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const { checkAndKillOrphanProcesses } = require('@abtnode/util/lib/pm2/check-orphan-processes');
|
|
12
|
+
const pm2 = require('@abtnode/util/lib/pm2/async-pm2');
|
|
13
|
+
const Logger = require('@abtnode/logger');
|
|
14
|
+
const {
|
|
15
|
+
PROCESS_NAME_ORPHAN_CLEANUP,
|
|
16
|
+
DAEMON_SCRIPT_PATH,
|
|
17
|
+
SERVICE_SCRIPT_PATH,
|
|
18
|
+
ORPHAN_CHECK_DELAY: DEFAULT_ORPHAN_CHECK_DELAY,
|
|
19
|
+
} = require('@abtnode/constant');
|
|
20
|
+
|
|
21
|
+
const logger = Logger('orphan-cleanup-worker', { filename: 'orphan-cleanup-worker' });
|
|
22
|
+
|
|
23
|
+
const ORPHAN_CHECK_DELAY = parseInt(process.env.ORPHAN_CHECK_DELAY || DEFAULT_ORPHAN_CHECK_DELAY, 10);
|
|
24
|
+
|
|
25
|
+
logger.info(`Orphan cleanup worker started, will check after ${ORPHAN_CHECK_DELAY}ms`);
|
|
26
|
+
|
|
27
|
+
setTimeout(async () => {
|
|
28
|
+
try {
|
|
29
|
+
// Cleanup daemon.js orphans
|
|
30
|
+
await checkAndKillOrphanProcesses({
|
|
31
|
+
scriptName: DAEMON_SCRIPT_PATH,
|
|
32
|
+
logger,
|
|
33
|
+
force: true, // Force mode to work from any PM2 context
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// Cleanup service.js orphans
|
|
37
|
+
await checkAndKillOrphanProcesses({
|
|
38
|
+
scriptName: SERVICE_SCRIPT_PATH,
|
|
39
|
+
logger,
|
|
40
|
+
force: true,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
logger.info('Orphan cleanup completed successfully');
|
|
44
|
+
} catch (error) {
|
|
45
|
+
logger.error(`Orphan cleanup failed: ${error.message}`);
|
|
46
|
+
} finally {
|
|
47
|
+
// Remove self from PM2 after cleanup to avoid record clutter
|
|
48
|
+
try {
|
|
49
|
+
await pm2.connectAsync();
|
|
50
|
+
logger.info('Removing cleanup process from PM2...');
|
|
51
|
+
await pm2.deleteAsync(PROCESS_NAME_ORPHAN_CLEANUP);
|
|
52
|
+
logger.info('Cleanup process removed from PM2 successfully');
|
|
53
|
+
} catch (err) {
|
|
54
|
+
logger.warn(`Failed to remove cleanup process from PM2: ${err.message}`);
|
|
55
|
+
} finally {
|
|
56
|
+
pm2.disconnect();
|
|
57
|
+
process.exit(0);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}, ORPHAN_CHECK_DELAY);
|
|
61
|
+
|
|
62
|
+
// Handle termination signals gracefully
|
|
63
|
+
process.on('SIGINT', () => {
|
|
64
|
+
logger.info('Orphan cleanup worker received SIGINT, exiting');
|
|
65
|
+
process.exit(0);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
process.on('SIGTERM', () => {
|
|
69
|
+
logger.info('Orphan cleanup worker received SIGTERM, exiting');
|
|
70
|
+
process.exit(0);
|
|
71
|
+
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blocklet/cli",
|
|
3
|
-
"version": "1.16.
|
|
3
|
+
"version": "1.16.54-beta-20251016-050817-2fc632b8",
|
|
4
4
|
"description": "Command line tools to manage Blocklet Server",
|
|
5
5
|
"homepage": "https://www.arcblock.io/docs/blocklet-cli",
|
|
6
6
|
"bin": {
|
|
@@ -35,28 +35,28 @@
|
|
|
35
35
|
"url": "https://github.com/ArcBlock/blocklet-server/issues"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@abtnode/blocklet-services": "1.16.
|
|
39
|
-
"@abtnode/constant": "1.16.
|
|
40
|
-
"@abtnode/core": "1.16.
|
|
41
|
-
"@abtnode/db-cache": "1.16.
|
|
42
|
-
"@abtnode/logger": "1.16.
|
|
43
|
-
"@abtnode/models": "1.16.
|
|
44
|
-
"@abtnode/router-provider": "1.16.
|
|
45
|
-
"@abtnode/util": "1.16.
|
|
46
|
-
"@abtnode/webapp": "1.16.
|
|
38
|
+
"@abtnode/blocklet-services": "1.16.54-beta-20251016-050817-2fc632b8",
|
|
39
|
+
"@abtnode/constant": "1.16.54-beta-20251016-050817-2fc632b8",
|
|
40
|
+
"@abtnode/core": "1.16.54-beta-20251016-050817-2fc632b8",
|
|
41
|
+
"@abtnode/db-cache": "1.16.54-beta-20251016-050817-2fc632b8",
|
|
42
|
+
"@abtnode/logger": "1.16.54-beta-20251016-050817-2fc632b8",
|
|
43
|
+
"@abtnode/models": "1.16.54-beta-20251016-050817-2fc632b8",
|
|
44
|
+
"@abtnode/router-provider": "1.16.54-beta-20251016-050817-2fc632b8",
|
|
45
|
+
"@abtnode/util": "1.16.54-beta-20251016-050817-2fc632b8",
|
|
46
|
+
"@abtnode/webapp": "1.16.54-beta-20251016-050817-2fc632b8",
|
|
47
47
|
"@arcblock/did": "1.25.6",
|
|
48
48
|
"@arcblock/event-hub": "1.25.6",
|
|
49
49
|
"@arcblock/ipfs-only-hash": "^0.0.2",
|
|
50
50
|
"@arcblock/jwt": "1.25.6",
|
|
51
51
|
"@arcblock/ws": "1.25.6",
|
|
52
|
-
"@blocklet/constant": "1.16.
|
|
52
|
+
"@blocklet/constant": "1.16.54-beta-20251016-050817-2fc632b8",
|
|
53
53
|
"@blocklet/error": "^0.2.5",
|
|
54
54
|
"@blocklet/form-collector": "^0.1.8",
|
|
55
|
-
"@blocklet/images": "1.16.
|
|
56
|
-
"@blocklet/meta": "1.16.
|
|
57
|
-
"@blocklet/resolver": "1.16.
|
|
58
|
-
"@blocklet/server-js": "1.16.
|
|
59
|
-
"@blocklet/store": "1.16.
|
|
55
|
+
"@blocklet/images": "1.16.54-beta-20251016-050817-2fc632b8",
|
|
56
|
+
"@blocklet/meta": "1.16.54-beta-20251016-050817-2fc632b8",
|
|
57
|
+
"@blocklet/resolver": "1.16.54-beta-20251016-050817-2fc632b8",
|
|
58
|
+
"@blocklet/server-js": "1.16.54-beta-20251016-050817-2fc632b8",
|
|
59
|
+
"@blocklet/store": "1.16.54-beta-20251016-050817-2fc632b8",
|
|
60
60
|
"@blocklet/theme-builder": "^0.4.7",
|
|
61
61
|
"@ocap/client": "1.25.6",
|
|
62
62
|
"@ocap/mcrypto": "1.25.6",
|
|
@@ -154,7 +154,7 @@
|
|
|
154
154
|
"engines": {
|
|
155
155
|
"node": ">=14"
|
|
156
156
|
},
|
|
157
|
-
"gitHead": "
|
|
157
|
+
"gitHead": "6b624f4b7eba2ecee164a57112adda1a93aff513",
|
|
158
158
|
"devDependencies": {
|
|
159
159
|
"@types/fs-extra": "^11.0.4",
|
|
160
160
|
"@types/jest": "^29.5.13"
|