Like other processes in a Linux system, terminals take up resources. Because of this, we might sometimes want to prevent an unused terminal from running.
In this tutorial, we explore ways to close a terminal. First, we understand the terminal process in general. After that, we follow the stages of closing a terminal.
For brevity, in this tutorial, we:
- use the terms terminal and TTY interchangeably
- minimize the output of some commands to the useful essentials
We tested the code in this tutorial on Debian 11 (Bullseye) with GNU Bash 5.1.4. It should work in most POSIX-compliant environments.
2. Terminal Process
A TTY is a gateway (process) to the machine that the operating system (OS) provides to the user:
$ ps -H -t /dev/tty1 PID TTY CMD 660 tty1 agetty
In this state, the ps [-H]ierarchy shows us that [-t]erminal /dev/tty1 is simply a reservation by a TTY maintenance mechanism.
Later, the shell that runs over that terminal plays a vital role when it comes to leveraging control functions. In fact, the login shell is the first official point of contact with a TTY:
baeldung login: user Password: $
At this point, we see the prompt of a shell running inside a terminal. Let’s check which terminal that is with the tty command:
$ tty /dev/tty1
In this case, we use /dev/tty1. Of course, we can switch the TTY or use some higher-level virtual terminal like a PTY.
In all cases, closing a terminal is similar and may depend mainly on the initialization process.
3. Closing Terminals
Unlike when killing a terminal, e.g., when a TTY breaks, we aim to perform a smooth close operation.
3.1. Exit the Shell
Let’s check the current hierarchy of our TTY:
$ ps -H -t /dev/tty1 PID TTY CMD 666 tty1 login 667 tty1 bash
One of the most natural ways to get out of a terminal session is to close its shell with a command like exit:
$ tty /dev/tt1 $ exit [...] baeldung login:
As the main element of the TTY, exiting the shell frees up most resources related to the given terminal. Still, the main allocation process remains.
3.2. TTY Allocation and Deallocation
After stopping the shell, we’re back to the initial TTY:
$ ps -H -t /dev/tty1 PID TTY CMD 668 tty1 agetty
On the many distributions with the standard systemd, we can simply use systemctl to stop the relevant TTY allocation service:
$ systemctl stop [email protected]
The process is similar to the SystemV init but involves the handling of links and /etc/inittab.
After the above, we can use another terminal to verify nothing is running for /dev/tty1:
$ ps -H -t /dev/tty1 PID TTY CMD
The terminal is now closed. In fact, stopping the terminal maintenance service before ensuring a smooth exit for the shell and all its child processes will terminate all of them abruptly.
3.3. Reduce Available TTYs
As long as we don’t attempt to switch to /dev/tty1, the terminal will have no associated processes. However, as soon as we press CTRL+ALT+F1 or otherwise open that TTY, the system restarts the allocator:
$ ps -H -t /dev/tty1 PID TTY CMD 669 tty1 agetty
Actually, the reason for this is simple – terminals get allocated on demand. Moreover, configuring the way it’s done and the TTY limit happens according to the distribution.
For example, the older SystemV init uses /etc/inittab and /etc/init/tty*.conf to configure terminal allocation. On the other hand, the newer SystemD provides options in /etc/securetty and /etc/systemd/logind.conf*. What’s more, Berkeley Software Distribution (BSD) has /etc/ttys.
Once the desired configuration is in place, we can run deallocvt to ensure no resources are taken up by extra terminals:
Now, we have completely eliminated any leftover resources by any unused (not in the foreground, no selected text, not open by any process) terminal.
In this article, we saw how to close a terminal on several levels.
In conclusion, we can simply close a TTY by exiting its shell. Depending on our needs, lower-level options also exist.