バグ #1322
完了エラーメッセージを出さず突然正常終了することがある
説明
--debug
オプションを付けていても、エラーメッセージを出さずに正常終了することがあります。
先週末のOSC開催中に会場やmastodonで少し話題になりましたが、Ruby 2.6系の仕様変更が影響しているのではないかという話でした。
チケットを立てておこうということになっていたと思いますので、立てました。
ついでに、簡単に再現する方法を見つけたので、書いておきます。これがすべてかどうかはわかりません。
この方法ではruby-2.5.3では何回やっても再現せず、ruby-2.6.1では今の所100%再現します。
再現手順
1. コンソールを開く
2. bg_system('true')
を実行する。
関連するチケット
toshi_a 初音 さんが5年以上前に更新
- 関連している バグ #1318: popup_notifyイベントの第二引数にPlugin::Twitter::Message以外のMessage Modelを渡すと通知が発生しない を追加
toshi_a 初音 さんが5年以上前に更新
- 担当者 を toshi_a 初音 にセット
- 対象バージョン を 3.9 にセット
- プラグイン名 を libnotify にセット
根本的な解決ではないですが、 #1318 の延長で、libnotify gemを使ってデスクトップ通知を表示すれば、クラッシュしません。効率も良くなっています。
GitHub - splattael/libnotify: Ruby bindings for libnotify using FFI.
外部コマンドを実行しなくなったため、WindowsやMacでパッチするのが若干面倒かもしれませんが、libnotifyという名前のプラグインをサードパーティプラグインとしてロードすればいいだけだし良いのかなぁという気持ちもあります。
以下に当てはまる人の意見がほしいです。
- Linuxで、このチケットの問題が再現していた人は、このブランチを使ってどうなるか。
- WindowsやMacで、このチケットにどのような影響があるか。
toshi_a 初音 さんが5年以上前に更新
通知のほか、ブラウザでURLを開く時には外部コマンドを呼んでいるので、このときに終了することがあります。
現在のmikutterでは終了時には事前にメインウィンドウが破棄されてるはずなので、メインループを抜けてもウィンドウが残っているならもう一度メインループに復帰すれば大丈夫かも
toshi_a 初音 さんが5年以上前に更新
- ステータス を 実装待ち から レビュー待ち に変更
- 担当者 を toshi_a 初音 から cob odo に変更
- プラグイン名 を libnotify から gtk に変更
- ブランチ を topic/1322-never-ending-mainloop にセット
ブラウザを外部コマンドで開くときにも再現できたので、gtkプラグインの問題に変更しておきます。
現在のmikutterでは終了時には事前にメインウィンドウが破棄されてるはずなので、メインループを抜けてもウィンドウが残っているならもう一度メインループに復帰すれば大丈夫かも
Gtkプラグインがロードされている状態では、メインループ脱出時にウィンドウを確認し、まだ破棄されていないウィンドウがあれば警告を表示して復帰するようにしてみました。
この変更を適用して再現手順を実行すると、ログに復帰した旨が出力され、終了しません。
Gtkプラグインがあるときだけ発生する問題なので、このプラグイン内で回避するということで良いと思います。