Here's how to control multiple processes in a terminal.
C-c- kill process
[mycommand] &- background new process
C-z- background foreground process
jobs- see background processes
fg- restore latest bg process
fg %1- restore bg process by job id
[mycommand] &|- separate process from terminal
Processes and Terminals
You know, the accurate specifics about terminal terminology still baffle me. We have terminals, pseudo-terminals, terminal emulators, and more. For now, think of this: I open a terminal emulator program, like alacritty, and this is what I mean by "terminal" in this article.
We can run different programs as processes within a terminal, like
nvim (to edit text files) or
mpv (to play media).
Most commonly, when we run a program, we're are running it in the foreground. We run
nvim app.clj, and we're looking at the Neovim editor, as output in the terminal. We run
mpv https://www.youtube.com/watch?v=IxSUAVmhg40, and an mpv video window is spawned, and we're watching some Clojure edu content. Both of these processes are in the foreground.
When a program is in the foreground, it ties up the entire terminal. Continued input affects that program (ie, typing in
nvim or seek control keys in
Stop Foreground Process
To stop a process in the foreground, type
C-c (control-c), the terminal will get sent the
SIGINT signal, and the process will shutdown.
There can also be a process attached to the terminal but be in the background. A background process will not tie up your terminal input. You type still and start new processes, having multiple processes, now, in the terminal.
Start Process in Background
To start a process in the background, add a
& at the end of the command, like
mpv https://www.youtube.com/watch?v=IxSUAVmhg40 &.
The process will start, but in the background, and you can still type in your terminal.
Move a Process to the Background
What if you've already started a process, but you want to use the terminal for something else. You'll have to move the foreground process into the background. You can do this with
Let's say that you're editing some source code, but then you want to run your tests in the same terminal:
nvim app.clj- foreground
C-z- move to background
clj -X:test- run a new foreground process in the same terminal
See Background Processes
Once I have background processes, how do I see them? I run
jobs. This will give me a list something like this:
❯ jobs  - suspended nvim temp.txt  + suspended mpv
Restore a Background Process
To restore a process (that's in the background) to the foreground, I use
fg. That will restore the latest process.
If, when running
jobs, I want to restore a different process, besides, this default, I can use the job id. That is the number, in . For instance, to restore the
nvim temp.txt job in the list above, one could use
Close All Processes
To close all processees, whether in the foreground or the background, one can close the terminal.
Separate Process From Terminal
To allow the terminal to be closed without interferring with running of a process, that process must be started in such a way as to separate it from the terminal process itself. For watching
mpv in its own, independent window, for instance, try:
mpv https://www.youtube.com/watch?v=IxSUAVmhg40 &|.
I have only a crude view of what this does. I don't actually know what the name of this
&| operator is. But we're marking it as background, in combo with piping it elsewhere. The elsewhere is a separate process. If anyone has a more accurate view of this operation, please let me know.
For the terminal-dweller, these commands are so useful. You have greater control and flexibility, making space for many processes in the terminal and controlling how they coexist. Any other tips you have on the subject?