nodejsを使っていてプロセス管理が必要になったので、その際の備忘録を書いておきたいと思います。
残念ながら、ブラウザからプロセス管理はセキュリティの制約上できませんが、できると色々まずい気もしますし。
必要になった経緯
Electronを用いたデスクトップツールを作成時している際に必要になりました。
ボタンを押したらコマンドラインから別のプログラムを実行する必要があったんだけど、親プロセスが起動したあと、子プロセスが実際にはプログラムを実行しているらしく。問題は、親プロセスは子プロセスを起動したすぐに自然に消滅してしまって、素直にやると子プロセスが裏で生き残り続けてしまう状態になってました。
結果、子プロセスがメモリ食ったり、ハードウェア資源を占有し続けてしまい、上手く動かないじょうたいになってました。
インストール方法
npm からインストールできます。
npm install ps-tree
使い方
Node.jsでのインポートなのでrequireを使います。
psTree = require('ps-tree')
昨今は、Node.jsでもimport を使うことが推奨されるので、その場合は必要なものだけimportしましょう
import * as psTree from 'ps-tree'
とにかく使ってみる
使用すると、下記のような感じで結果が返ってきます。
PPIDは親プロセスでPIDが子プロセスですね。
コマンドは、プロセスを生成したコマンドで、nodeから実行したのでしっかりと「node」と返ってきています。
特定のコマンドから生成したプロセスのみとかでフィルタリングできるので便利ですね。
死滅管理まではしてくれないので自分でkillする
javascript でプロセスをキルするのは、Node.jsに組み込まれているProcess を使うのが便利です。
process.kill(`プロセスID`)
単純に組み合わせてみると以下のような感じでしょうか。
配列で得られるのですべてキルします。
const psTree= require('ps-tree'); const childProcess=require('child_process'); const sampleProcess = childProcess.exec("node -e 'while (true);'"); console.log(`${sampleProcess.pid} is parent process`); psTree(sampleProcess.pid,(err,children)=>{ console.log(children) children.forEach(child => { // process.kill の引数は数字のみ process.kill(Number(child.PID)) console.log(`${child.PID} is killed`); }); })