Displaying and Interacting with processes using Proced
If you’re a regular user of the commandline tools
ps then I have good news for you: there’s an Emacs command that does that and it works on Windows too!
The command is
M-x proced and it is modelled on
M-x dired (but it is not built on top of dired) and it does shadow most of the common navigational aids:
p move down and up and
g refreshes the buffer, for instance.
It’s also feature rich; by combining the utility of
ps with the sortable, columnized and interactive system of
top you get the best of both worlds.
What I like about it is that it’s a buffer like any other in Emacs. So if you’re keeping your eye on a handful of processes you can use
highlight-phrase to highlight the strings you want to visually separate from the rest. It is also, in true Emacs tradition, very customizable – but I’ll get to that a bit later.
Marking, Sorting, Filtering and Formatting Columns
By default you will be given the
short formatting but you can change the number of displayed columns by typing
F. You’ll be shown a prompt where you can select from
You can also change the filtering – which defaults to
all – by pressing
f. Like the formatting key above you are given a list of common filter types. Furthermore you can filter by any of the visible columns by moving your point to it and pressing
RET. It will incrementally filter so you can repeatedly filter as much as you like – this is a very handy feature. Refreshing the buffer with
g does not reset it: you must change your filter with
Like dired you can mark processes with both
m (they do the same thing) and unmark with
u. You can mark and unmark all processes with
U. And finally you can then filter the marked processes with
There are some specialty mark commands as well. The command
t will invert your marks and
P will mark the children or parents of the process point is on.
Finally you can sort by columns as well. All the sort commands are bound to
M-x proced-sort-xxx and to the prefix menu
|Sort by CPU %|
|Sort by Memory %|
|Sort by PID|
|Sort by Start Time|
|Sort by CPU Time|
|Sort by User|
|Sort by other column|
If you want to sort by a column not bound to a key you must use
s S where you are then prompted for the name of a column to sort by.
Sending Signals and Interacting with processes
Unsurprisingly sending POSIX signals is fully supported by Emacs. This is done using the Elisp function
signal-process. Because of that all signals are sent using the uid of the Emacs process proced is running in. Conceivably proced could be changed to call out to userland command
kill (using an external command is supported) and, by combining it with TRAMP for sudo elevation it could kill processes owned by other users. Sadly that functionality does not currently exist but abusing the
default-directory variable might work.
To send a signal mark the processes you want to signal, or alternatively put your point on the target process, and press
x. You will be shown a list of target processes and you can optionally change the default suggestion of
TERM to something else.
When the signal(s) have been sent you can review the log by pressing
Understanding & Customizing Proced’s Internals
Proced is very flexible and it also supports the customize interface. You can access this inferface by typing
M-x customize-group proced RET.
Proced will use the Elisp function
list-system-processes to retrieve all the known PIDs and then call
process-attributes on each one of them to fetch the process details. The good news is that Proced does not parse the output of
/proc directly but relies on Emacs’s compatibility layer to make sense of everything: this also means it works rather well on Windows.
Proced can auto update the display and you can enable this for a Proced buffer by running the command
proced-toggle-auto-update and it will update every
proced-auto-update-interval which is by default 5 seconds.
To make Proced auto update by default you must add a hook:
(defun proced-settings () (proced-toggle-auto-update)) (add-hook 'proced-mode-hook 'proced-settings)
You are free to customize other settings in this mode hook in much the same way you would other mode hook functions.
If you’re really serious about tweaking the way the columns are displayed you can try your hand at editing the alist variable
proced-grammar-alist. It controls how sorting, justification and string formatting works for each of the process attributes returned by
You can also alter the default Proced filter by changing
user to something else. Creating your own filter is also possible by adding to the
proced-filter-alist; in fact this functionality lets you do rather complex things such as calling a custom function for every process attribute.
The default sort and sort order (descending or ascending) is governed by
There are many more customizable options and the author of Proced, Roland Winkler, has done a great job ensuring they’re accessible from Emacs’s customize interface.
It goes without saying that Proced is a both feature rich and customizable. I think it’s a very capable replacement for most
top use cases, but like so features in Emacs almost nobody has heard of it.