自己电脑电脑上有时候需要打开很多的应用,比如:firefox, google-chrome, inkscape,
gimp, terminal, shutter 等等。在一些情况下需要杀死其中的一些进程,比如需要杀死
google-chrome 这个浏览器进程。我目前的方案是使用 percol 这个终端插件,
GitHub - mooz/percol: adds flavor of interactive filtering to the traditional pipe concept of UNIX shell 这是一个交互的终端滤除插件。我在终端配置文件
.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
:
这个貌似不能满足我的需求。我的是一方面可以查看当前系统中的运行的进程,然后最好可以交互式地查找一个进程,最后把这个进程杀死。这个功能应该是很常用的一个功能。反正我在我自己的电脑上还是比较常使用这个功能的。
我感觉使用percol很好,也是一款终端命令行的神器。
cireu
6
这个东西能做到的,现在大部分{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反而没那么重要。
这只是我的猜测吧,因为以前我也拍脑袋定过很多数组长度
我提交了个 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
你们碰到过这个问题吗?现在这个功能基本上不能使用了。
cireu
19
M-x toggle-debug-on-error