トップ 最新

かってきままな日々

2020-03-26 (Th) [長年日記]

_ Terminator が起動しない理由

Wayfire + Waybar を使ってて、Waybar 上のボタンをクリックして 端末の Terminator を起動するように設定してある。

が、Waybar 起動後、最初にボタンをクリックした時は問題ないのに、 2回目以降は Terminator が起動しない。

標準エラー出力に何か出てるかな、と思ってファイルにリダイレクトしてみたら、 以下の例外が発生していた。

Traceback (most recent call last):
  File "/usr/bin/terminator", line 114, in <module>
    TERMINATOR = Terminator()
  File "/usr/lib/python2.7/site-packages/terminatorlib/terminator.py", line 72, in __init__
    self.prepare_attributes()
  File "/usr/lib/python2.7/site-packages/terminatorlib/terminator.py", line 97, in prepare_attributes
    self.pid_cwd = get_pid_cwd()
  File "/usr/lib/python2.7/site-packages/terminatorlib/cwd.py", line 42, in get_pid_cwd
    system = platform.system()
  File "/usr/lib/python2.7/platform.py", line 1303, in system
    return uname()[0]
  File "/usr/lib/python2.7/platform.py", line 1270, in uname
    processor = _syscmd_uname('-p','')
  File "/usr/lib/python2.7/platform.py", line 1005, in _syscmd_uname
    rc = f.close()
IOError: [Errno 10] 子プロセスがありません

uname -p を実行してる……?

なんか知らんが、Terminator は platform.system() を使って環境がどんなシステム なのかを取得している。そして platform.system()uname -p を実行して、 パイプ経由で uname の出力を取得しているらしい。 が、f.close()waitpid() してそこで子プロセスがなくて例外が発生する、と。

なんで子プロセスがないのだろう? 他のプロセスが waitpid() してるのだろうか… と、ここしばらく探していた。

python2.7 の platform.system() に何か問題でもある? と思ってぐぐって見つけた。 SIGCHLD を SIG_IGN にしてるとそういうことが起きるらしい。

なるほど!!!! そりゃそうだ。忘れてた。

Waybar は最初に子プロセスを作った後、SIGCHLD を SIG_IGN に設定している。 これが原因か。exec する前に SIG_DFL に戻せば治る。

治った!!

1ヶ月程前に書いた Waybar の issue にコメント付けとこ。