UNPKG

929 BPlain TextView Raw
1import { utils } from '@neo-one/utils';
2import isRunning from 'is-running';
3import { FailedToKillProcessError } from './errors';
4
5export 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 // tslint:disable-next-line no-loop-statement
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