<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: l5y</title>
    <description>The latest articles on DEV Community by l5y (@l5y).</description>
    <link>https://dev.to/l5y</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3811722%2F81b29bf0-8080-42cc-8a7c-6e3184240583.png</url>
      <title>DEV Community: l5y</title>
      <link>https://dev.to/l5y</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/l5y"/>
    <language>en</language>
    <item>
      <title>psn - a minimalist process navigator for Linux</title>
      <dc:creator>l5y</dc:creator>
      <pubDate>Sat, 07 Mar 2026 15:45:40 +0000</pubDate>
      <link>https://dev.to/l5y/psn-a-minimalist-process-navigator-for-linux-37jn</link>
      <guid>https://dev.to/l5y/psn-a-minimalist-process-navigator-for-linux-37jn</guid>
      <description>&lt;p&gt;When a process hangs up on me on a server, my usual workflow is a mix of &lt;code&gt;ps aux | grep&lt;/code&gt;, &lt;code&gt;pgrep&lt;/code&gt;, copying PIDs, and reaching for &lt;code&gt;kill&lt;/code&gt;. It works, but it interrupts my workflows. I decided to go for a little &lt;em&gt;quality-of-life&lt;/em&gt; upgrade and implement &lt;code&gt;psn&lt;/code&gt;, the &lt;em&gt;process status navigator&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/l5yth/psn" rel="noopener noreferrer"&gt;psn&lt;/a&gt; is a small Rust TUI. You launch it, find the process, and send it a signal; all without leaving the terminal or typing a PID by hand.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://asciinema.org/a/820051" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faha17x84jfzoc5gjfp5g.png" alt="asciicast" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem it solves
&lt;/h2&gt;

&lt;p&gt;The command-line is where I spend most of my time and earn a living: personal laptops, remote servers, etc. The tooling story for process management is surprisingly fragile. I started to become a power user of &lt;code&gt;btop&lt;/code&gt;, my favorite &lt;em&gt;*top-derivate,&lt;/em&gt; but kept falling back to &lt;code&gt;ps&lt;/code&gt; when I had to deal with processes. However, its output is a wall of text that you have to mentally parse or pipe through &lt;code&gt;grep&lt;/code&gt; and then act on with a subsequent command.&lt;/p&gt;

&lt;p&gt;The real need is simple: find a process by name and send it a signal. It cannot be so hard? ;)&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;psn&lt;/code&gt; displays a table of running processes inside a navigatable terminal user interface. Each row of the table shows the process name, PID, user, CPU and memory usage, status, and the full command string. Processes are arranged in a parent–child tree so you can see what spawned what.&lt;/p&gt;

&lt;p&gt;From there you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate with arrow keys up/down and page up/down&lt;/li&gt;
&lt;li&gt;Collapse and expand subtrees with arrow keys left/right&lt;/li&gt;
&lt;li&gt;Filter on the fly by pressing &lt;code&gt;/&lt;/code&gt; and typing - the list narrows as you type, and matched text is highlighted in the name and command columns&lt;/li&gt;
&lt;li&gt;Pre-filter at launch by passing a substring (&lt;code&gt;psn cargo&lt;/code&gt;) or a regular expression (&lt;code&gt;psn -r '^rust'&lt;/code&gt;) as an argument&lt;/li&gt;
&lt;li&gt;Send a signal by pressing &lt;code&gt;1&lt;/code&gt; through &lt;code&gt;9&lt;/code&gt;; the key maps directly to the Unix signal number - &lt;code&gt;9&lt;/code&gt; is SIGKILL, &lt;code&gt;1&lt;/code&gt; is SIGHUP, &lt;code&gt;2&lt;/code&gt; is SIGINT, and so on&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. I didn't ask for more and I also don't think it needs more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;The fastest path is via &lt;a href="https://crates.io/crates/psn" rel="noopener noreferrer"&gt;crates.io&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cargo install psn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Arch Linux the &lt;a href="https://aur.archlinux.org/packages/psn-bin" rel="noopener noreferrer"&gt;psn-bin&lt;/a&gt; AUR package installs a prebuilt binary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yay -S psn-bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or build from the &lt;a href="https://github.com/l5yth/psn" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt; directly with &lt;code&gt;cargo build --release&lt;/code&gt;. A &lt;a href="https://github.com/l5yth/psn/blob/main/flake.nix" rel="noopener noreferrer"&gt;Nix flake&lt;/a&gt; and a &lt;a href="https://github.com/l5yth/psn/tree/main/packaging/gentoo" rel="noopener noreferrer"&gt;Gentoo ebuild&lt;/a&gt; are also available.&lt;/p&gt;

&lt;p&gt;The only runtime dependency is a GNU/Linux system with &lt;code&gt;procfs&lt;/code&gt; support. No &lt;code&gt;ps&lt;/code&gt; wrapper, no external binaries - process data is read directly via &lt;a href="https://crates.io/crates/sysinfo" rel="noopener noreferrer"&gt;sysinfo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you spend any meaningful time on Linux servers and find yourself reaching for &lt;code&gt;ps | grep | kill&lt;/code&gt; more than you'd like, give &lt;code&gt;psn&lt;/code&gt; a try. Feedback and issues are welcome!&lt;/p&gt;

</description>
      <category>rust</category>
      <category>linux</category>
      <category>tui</category>
      <category>pid</category>
    </item>
  </channel>
</rss>
