1 | import { utils } from '@neo-one/utils';
|
2 | import isRunning from 'is-running';
|
3 | import { FailedToKillProcessError } from './errors';
|
4 |
|
5 | export const killProcess = async (pid: number): Promise<void> => {
|
6 | const startTime = utils.nowSeconds();
|
7 | let alive = isRunning(pid);
|
8 | if (!alive) {
|
9 | return;
|
10 | }
|
11 |
|
12 |
|
13 | while (utils.nowSeconds() - startTime <= 10) {
|
14 | try {
|
15 | let signal = 'SIGINT';
|
16 | if (utils.nowSeconds() - startTime > 7) {
|
17 | signal = 'SIGKILL';
|
18 | } else if (utils.nowSeconds() - startTime > 5) {
|
19 | signal = 'SIGTERM';
|
20 | }
|
21 | process.kill(pid, signal);
|
22 | } catch (error) {
|
23 | if (error.code === 'ESRCH') {
|
24 | return;
|
25 | }
|
26 |
|
27 | throw error;
|
28 | }
|
29 | await new Promise<void>((resolve) => setTimeout(resolve, 200));
|
30 | alive = isRunning(pid);
|
31 | if (!alive) {
|
32 | return;
|
33 | }
|
34 | }
|
35 |
|
36 | throw new FailedToKillProcessError(pid);
|
37 | };
|
38 |
|
\ | No newline at end of file |