Share Terminal Amongst Multiple Processes
Here's how to control multiple processes in a terminal.
tl;dr
C-c
- kill process[mycommand] &
- background new processC-z
- background foreground processjobs
- see background processesfg
- restore latest bg processfg %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).
Foreground Processes
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 mpv
).
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.
Background Processes
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 C-z
(control-z).
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
- foregroundC-z
- move to backgroundclj -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
[1] - suspended nvim temp.txt
[2] + 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 fg %1
.
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.
So Useful
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?
Resources
man pty
man tty
- pty vs tty