如何在 emacs 中杀死外部的进程后者应用?

自己电脑电脑上有时候需要打开很多的应用,比如:firefox, google-chrome, inkscape, gimp, terminal, shutter 等等。在一些情况下需要杀死其中的一些进程,比如需要杀死 google-chrome 这个浏览器进程。我目前的方案是使用 percol 这个终端插件, https://github.com/mooz/percol 这是一个交互的终端滤除插件。我在终端配置文件 .zshrc 中添加下面的代码:

#+BEGIN_SRC shell
function pk() {
    if [[ $1 =~ "^-" ]]; then
        QUERY=""            # options only
    else
        QUERY=$1            # with a query
        [[ $# > 0 ]] && shift
    fi
    ppgrep $QUERY | xargs kill -9 $*
}
#+END_SRC

但是现在由于经常在 emacs 中来完成自己的任务,懒得在切换到终端上执行命令来杀死一 些进程。不知道大家是不是在 emacs 中直接杀死外部进展的一些经验。另外,counsel 插 件中提供了这个命令 counsel-linux-app ,可以在 emacs 中直接打开外部的一些应用。但 是这个插件并没有提供杀死外部应用的功能。

很少有这样的需求。Emacs 中照样可以运行 Shell 命令,甚至可以运行 curses 应用。此外 Helm 还有个 helm-top

这个貌似不能满足我的需求。我的是一方面可以查看当前系统中的运行的进程,然后最好可以交互式地查找一个进程,最后把这个进程杀死。这个功能应该是很常用的一个功能。反正我在我自己的电脑上还是比较常使用这个功能的。

直接用htop,简单快捷

我感觉使用percol很好,也是一款终端命令行的神器。

这个东西能做到的,现在大部分{z,fi}sh都可以

估计你指的是 helm-top,截图就是演示过滤 Emacs 进程,再按确定键就是杀死 (SIGTERM)。

完全符合你的描述。哪个需求不能满足吗?

Emacs 还有获得系统进程信息的 API

  • process-attributes
  • list-system-processes

参考 (elisp) System Processes

不过貌似只能获得进程的命令名字,没有完整路径和命令行参数。写了个命令试试:

(defun chunyang-ps ()
  "List system processes."
  (interactive)
  (with-current-buffer (get-buffer-create "*System Processes*")
    (erase-buffer)
    (dolist (pid (list-system-processes))
      (let-alist (process-attributes pid)
        (insert (format "%-5d %s\n" pid .comm))))
    (goto-char (point-min))
    (pop-to-buffer (current-buffer))))

我使用的 helm-top 查看一些进程,里面都没有啊,奇怪。这个显示的进程和linux自带的top命令显示的进程是什么关系?

就是用 top 命令实现的,所以叫这个名字。参见 helm-top-command

Emacs原生命令proced应该满足你的需求:

如果用oh-my-zsh,直接输入kill <TAB>就可以查找,配合fzf非常好用:

2 个赞

proced是emacs自带的命令,感觉这个比较和emacs配合的比较好。感觉比较好用。之前竟然没有发现这么好用的功能。

不知道是不是 Emacs 在 macOS 下的 API 有问题,命令名称被截断了,明明是 Google Chrome Helper 却成了 Google Chrome He(截图)。

名字太长作了字符串截断处理

process-attributes 就有这个问题,要么是 Emacs 的 Bug,要么是系统的 API 有这个限制,Emacs 不太可能会主动截断,并且 16 个字符不太可能算「太长」。

(alist-get 'comm (process-attributes 47065))
;; => "Google Chrome He"

不清楚,但看起来大概率是故意为之,超过16个字符的后面都被截断。也许是兼容或者是其他原因?

老的C代码里有很多字符串数组是写死的,16/32/64/128/256这些都是很常见的,对于老系统很可能是16或者32这样的,节省内存啊。而且,对于进程来讲PID应该更重要,command name反而没那么重要。

这只是我的猜测吧,因为以前我也拍脑袋定过很多数组长度 :sweat_smile::sweat_smile::sweat_smile:

我提交了个 Bug,Andreas Schwab 说「probably a kernel limitation」:

https://debbugs.gnu.org/cgi/bugreport.cgi?bug=36287;msg=8

Linux 下的 M-x proced 比 Mac 下的要强,因为前者能显示命令行参数,Mac 上只有命令名字(而且还不全)。

在使用 proced 的过程中,一直出现下面的提示错误,奇怪了: window–resize-mini-window: Args out of range: -225, 0, 2147483647 你们碰到过这个问题吗?现在这个功能基本上不能使用了。

M-x toggle-debug-on-error

可以。奇怪,怎么会出现这个错误了。