This is the first in a series to come, doubtfully dubbed #AutomaticAlley. It’s where I will share small bits and bites of scripts and other tiny tricks to automate away boring and error prone stuff. The things we keep doing all the time, the things that annoy us that we need to to automate especially if we want to keep working on the command line a sane practice.
In today’s episode: How to kill any program anytime with ease. For this we create a simple shell alias that kills any program that looks like the one that is bothering us. No need to go to activity screens or whatnot. In fact for those of us using tiling window managers or who otherwise generally live on the command line we just stay in our homes!
We use the pkill
command for this. It is based on the loved grep
command that finds anything by regex or name. Then from the manual (man pkill
) we learn:
pgrep looks through the currently running processes and lists the process IDs which match the selection criteria to stdout.
[..]
pkill will send the specified signal (by default SIGTERM) to each process instead of listing them on stdout.
So we learn that pkill
is based on pgrep
which is a command that will list processes that are running currently. Now we need to be sure that the one we want is easily matched, and we do not want to have to remember exact spelling of even type all of it. After all we want to be as lazy as we can!
Let’s use pgrep to get the right matches
By the way: If you are using a mac and pkill or pgrep are not available you can install proctools: brew install proctools
Let’s ask the system what we have: pkill --help
. We find:
-i, --ignore-case match case insensitively
Yes! We’ll take it. We’re not particular about case! So let’s try it! We run spotify. And then type:
pgrep -i spotify
or
pgrep -i SpoTify
or
pgrep -i spoti
or
pgrep -i otif
Looks good right ? It matches all! But wait… when we run some selenium tests for instance we need to run the selenium server. Usually in a repo where we use it we run npx selenium-standalone install && npx selenium-standalone start
or similar,generally automated away in a nice npm <selenium-command>
in package.json.
Now these have a tendency to clog up the system, or hang in zombie state somehow. So lets see if we could pgrep
and thus pkill
it.
pgrep -i selenium
Nothing! Nothing!? Unfortunately it does not work. So lets see what else we have:
-f, --full use full process name to match
That sounds good. Full whatever is probably more than what we had! And indeed:
pgrep -i -f selenium
And yes there we have something! If we would like to compare it, the -a
option will display the full command line:
pgrep -i -f -a selenium
pgrep -i -f -a spotify
So now lets kill ‘em!
pkill -i -f selenium
pkill -i -f spotify
And if you feel like it is too silent now, and you like more feedback, pkill -h
tells us:
-e, --echo display what is killed
So now we have:
pkill -i -f -e selenium
Let’s now make it easier! Simple is good!
Who wants to remember all of that, or look it up every time? Not us smart (lazy) kids!
So now, depending on your shell we have something like a .zshrc
or .bashrc
usually in our home directory.
In it we want to make an alias, so we add a line it:
alias dieSpotify='pkill -i -f -e spotify'
Save it and reload the shell, or open a new terminal. Then just run dieSpotify
. And yes!
But wait… do we have to do that for each program we might ever want to kill ? That is crazy!
And of course the answer is no, we automated it, now we parametrize it! We can pass an argument to the alias. So we change the line into:
die='pkill -i $1 -f -e'
The $1
part here refers to the argument we pass so now we can kill everything at our convenience. Go Rambo!
die spoti
die chrom
die KeePass
[..etc..]
One time effort, but now hanging programs, or programs that clog up the system with processes that do not get closed properly etc. Bam… Kill them with ease and comfort :)
Was it useful ? You have a better plan ? Let me know in the comments!