Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

エンジンプロセスの停止をtreeKillではなく通常のkillにしたい #2167

Closed
Hiroshiba opened this issue Jul 10, 2024 · 2 comments
Labels
初心者歓迎タスク 初心者にも優しい簡単めなタスク 機能向上

Comments

@Hiroshiba
Copy link
Member

Hiroshiba commented Jul 10, 2024

内容

エンジンの停止はtreeKillを使っていて、windowsはどうしても強制終了するコードになっています。
これではエンジン側のgracefulシャットダウンができないので、通常のkill(SIGTERM送信的なの)にしたいです。

ただNodeのprocess.killは子プロセスをキルしないので、エンジン側が子孫をちゃんとkillするように作ってないと、ゾンビプロセス的な感じで残ってしまうかもしれません。

今のVOICEVOXエンジンにNodeでprocess.killしてみて(treeKillの部分を普通にprocess.killに変えれば良さそう)、ちゃんと消えてくれてそうならkillに置き換えたいです。

Pros 良くなる点

エンジン側が強制終了されなくなる

Cons 悪くなる点

確かめが必要

実現方法

  1. treeKillの部分をprocess.killに置き換え
  2. VOICEVOXエンジンのサブプロセスが残っているかをこのissueにコメント
  3. なさそうなことを確認できたらプルリク

VOICEVOXのバージョン

0..19.2

その他

可能ならいろんなOSで大丈夫か確認したいところですが、windowsで確認できればいったんOKな気がします。
(ビルド後にいろんなOSでチェックは必要)

VOICEVOXエンジン側でgracefulな処理をしたい部分があるので、実験結果をお待ちしています!

@Hiroshiba Hiroshiba added 機能向上 初心者歓迎タスク 初心者にも優しい簡単めなタスク labels Jul 10, 2024
@sabonerune
Copy link
Contributor

次のようにコードを修正してWindowsで試してみました。

treeKill(enginePid, (error) => {
if (error != undefined) {
log.error(`ENGINE ${engineId}: Error during killing process`);
reject(error);
}
});

-      treeKill(enginePid, (error) => {
-        if (error != undefined) {
-          log.error(`ENGINE ${engineId}: Error during killing process`);
-          reject(error);
-        }
-      });
+      const result = engineProcess.kill("SIGINT");
+      if (!result) reject("err");

Windows環境、VOICEVOX Engineの場合は子プロセスまで終了できていると思います。
(念のため--enable_cancellable_synthesisを追加しても全て終了した。)

エンジンの方にlifespanでファイルに書き込む処理を足して動作確認をしましたがgraceful shutdownは行われていないようです。


Nodeのドキュメントの記述で子プロセスがキルできるかよく分からないのですよね…
subprocess.kill([signal])

On Windows, where POSIX signals do not exist, the signal argument will be ignored, and the process will be killed forcefully and abruptly (similar to 'SIGKILL'). See Signal Events for more details.

Signal events

  • Sending SIGINT, SIGTERM, and SIGKILL will cause the unconditional termination of the target process, and afterwards, subprocess will report that the process was terminated by signal.

エンジンは恐らく強制終了。
エンジンの子プロセスはエンジンの親がキルされたというシグナルを受け取る?(見当違いかも)

@Hiroshiba
Copy link
Member Author

@sabonerune おお!! 検証ありがとうございます!!!!

Windows環境、VOICEVOX Engineの場合は子プロセスまで終了できていると思います。

なるほどです!!

エンジンの方にlifespanでファイルに書き込む処理を足して動作確認をしましたがgraceful shutdownは行われていないようです。
On Windows, where POSIX signals do not exist, the signal argument will be ignored, and the process will be killed forcefully and abruptly (similar to 'SIGKILL'). See Signal Events for more details.

ああああすみません。。。。。killシグナルを選べない可能性を考えていませんでした。。。。
強制終了になってしまうんですね・・・・・・・。

Nodeのドキュメントの記述で子プロセスがキルできるかよく分からないのですよね…

わからないですね・・・。Windowsだから・・・?あるいはpyinstallerくんがよしなにやってくれてるのかも。


なんにせよエンジン側をgracefulに終了できないならこのissueの提案は叶えられなそうです。。。

検証ほんとにありがとうございます!!!
(gracefulの戦いはまだ続きそうですね。。。 😇 )

@Hiroshiba Hiroshiba closed this as not planned Won't fix, can't repro, duplicate, stale Jul 11, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
初心者歓迎タスク 初心者にも優しい簡単めなタスク 機能向上
Projects
None yet
Development

No branches or pull requests

2 participants