@kyanny's blog

My life. Opinions are my own.

Emacs の中から呼んだプロセスが応答不能になったときの殺し方

eshelll なり shell-mode なりから呼んだプロセスが応答不能になってしまったときの殺し方。 C-c C-c などを送ってもダメな場合の話。

Emacs を終了しようとすると *Process List* バッファがでてきてプロセスを終了するかどうか一つずつ聞かれるけど、 Emacs は終了したくないしいちいち yes とタイプするのも面倒、とする。

eshell を起動して、

$ (list-processes) ; または C-c C-s

Proc   Status   Buffer      Tty Command
----   ------   ------      --- -------
sudo   run      *eshell*<2> /dev/ttyp0 /usr/bin/sudo perl ./cpan_install.pl
server listen   (none)       (network stream server on /tmp/emacs501/server)

で *Process List* バッファが出てくる。しかしこれだと pid とかがわからないので、

$ (get-process "sudo")
#<process sudo>

$ (process-id (get-process "sudo"))
2221

$ sudo kill -9 2221

などとすると、そのプロセスだけ選んで殺せる。そのプロセスを呼んでいたバッファは残る(eshell などならプロンプトに戻っている)


思いついて調べ始めてやってみて成功したときは「なんてスマートなんだ!」と自画自賛したけど、こうやって書いてみるとかえって面倒くさいなぁ。ゾンビバッファが残るのが嫌な人向けかも。自分がそういうタイプ。