Linux has several ways to keep a program running, both in the foreground and in the background, and to manage those processes. Here are some of the common methods:
-
Foreground Execution:
- By default, when you start a program from the terminal, it runs in the foreground. You have to wait for the program to finish before you can continue to use that terminal session.
-
Background Execution:
- You can start a program in the background by appending an
& to the command line. For example: ./my_program &.
- You can also suspend a foreground process by pressing
Ctrl + Z and then put it in the background using the bg command.
-
nohup Command:
-
The nohup command is used to run a command/script or shell script that can continue running in the background after you log out from a shell:
-
The output of the program is usually redirected to a file named nohup.out if it is not redirected by the user.
-
Screen and Tmux:
screen and tmux are terminal multiplexers that allow you to manage multiple terminal sessions from one window. They're particularly useful for long-running processes on remote machines.
- You can detach from a
screen or tmux session and leave it running in the background, then reattach to it later.
-
systemd Services:
systemd is the init system and service manager in most Linux distributions. It can be used to create services that run in the background whenever the system is running.
- Services are defined by
.service files, and you can control them using the systemctl command.
-
Cron Jobs:
cron is a time-based job scheduler in Unix-like operating systems. You can schedule scripts or programs to run at specific times and intervals using cron.
- This is often used for maintenance tasks but can also ensure a script runs at reboot or periodically.
-
at Command:
- The
at command schedules a one-time task to run at a certain time.
- This can be useful for running a program at a specific time without having to keep a terminal open.
-
init Scripts (SysVinit):
- Before
systemd, SysVinit was the traditional init system for Unix-like operating systems, and it used init scripts to manage system services.
- These scripts reside in
/etc/init.d and are executed during the startup and shutdown process to start and stop services.
-
Setsid Command:
- The
setsid command runs a program in a new session. This is another way to make a program continue running after the terminal is closed.
Each method has its own use case and set of features that make it suitable for different types of workloads and scenarios. For long-running or critical services, systemd or screen/tmux are often the preferred tools, whereas for simple background execution, &, nohup, or at might be sufficient.
Here are code examples for each method I mentioned:
-
Foreground Execution: Simply type the command and press Enter.
-
Background Execution: Start a program in the background:
Move a running foreground process to the background:
bg
-
nohup Command: Run a script or command that ignores the hangup signal:
-
Screen and Tmux: Start a new screen session:
# You can then start your program
./my_program
# Detach with Ctrl + A, then press D
Start a new tmux session:
# You can then start your program
./my_program
# Detach with Ctrl + B, then press D
-
systemd Services: Create a service file at /etc/systemd/system/my_service.service:
Description=My service
[Service]
ExecStart=/path/to/my_program
[Install]
WantedBy=multi-user.target
Start the service:
-
Cron Jobs: Edit the crontab file to add a new job:
# Add the following line to run my_script.sh every day at 5 am
0 5 * * * /path/to/my_script.sh
-
at Command: Schedule a command to run at a specific time:
-
init Scripts (SysVinit): Create an init script /etc/init.d/my_service:
# ...code to start or stop your program...
Make it executable and manage the service:
update-rc.d my_service defaults
/etc/init.d/my_service start
-
Setsid Command: Start a program in a new session:
These examples should give you a starting point for running programs under different conditions in Linux. Remember to replace /path/to/my_program and /path/to/my_script.sh with the actual paths to your executable or script.