让一个程序在 Linux 中一直运行

不积跬步无以至千里 / 2025-01-20 / 原文

要让一个程序在 Linux 中一直运行,可以使用多种方法,取决于你想要的具体行为。这些方法包括使用循环、守护进程、nohupsystemd等。下面是几种常见的方法:

1. 使用 while true 循环

如果你想让一个程序在终端中一直运行,可以将它放在一个无限循环中:

while true; do
  ./your_program      # 替换成你的程序
done

这个脚本会一直运行 your_program,每次程序执行完毕后会立刻重新启动。如果想在程序之间添加一点延迟,可以使用 sleep 命令:

while true; do
  ./your_program      # 替换成你的程序
  sleep 1             # 暂停 1 秒
done

2. 使用 nohup 后台运行

nohup 命令可以让程序在后台运行,并且即使关闭终端,程序也不会停止运行:

nohup ./your_program &
  • nohup:忽略挂断信号,使程序在退出终端后继续运行。
  • &:把程序放在后台运行。

输出会被默认重定向到 nohup.out 文件,你可以通过 tail -f nohup.out 查看程序的输出。如果想指定输出文件,可以这样做:

nohup ./your_program > output.log 2>&1 &

这里,output.log 是输出文件,2>&1 表示将标准错误输出重定向到标准输出。

3. 使用 cron 任务定时运行程序

如果你的程序需要在一定间隔内自动运行,可以使用 cron 定时任务来实现。例如,想要每分钟运行一次程序:

crontab -e

然后在 crontab 文件中添加一行:

* * * * * /path/to/your_program

这将使程序每分钟运行一次。cron 是非常灵活的调度工具,允许你指定任意时间间隔。

4. 使用 systemd 创建守护进程

如果你需要程序在系统启动时自动运行,并且一直保持运行状态(即守护进程),可以通过创建一个 systemd 服务来实现。这种方法适用于需要长期运行的服务类程序。

创建一个 systemd 服务文件,例如 /etc/systemd/system/your_program.service

[Unit]
Description=Your Program Service
After=network.target

[Service]
ExecStart=/path/to/your_program
Restart=always        # 程序崩溃时自动重启

[Install]
WantedBy=multi-user.target

然后启用并启动该服务:

sudo systemctl daemon-reload           # 重新加载 systemd 配置
sudo systemctl enable your_program     # 开机自动启动
sudo systemctl start your_program      # 启动服务

此时,your_program 将作为后台守护进程持续运行,系统启动时也会自动启动。

5. 使用 screen 或 tmux 运行长期任务

如果你希望能够手动控制程序的运行,但又希望关闭终端时保持程序继续运行,可以使用 screen 或 tmux 这类终端多路复用工具。

使用 screen 运行程序:

screen -S my_session    # 启动一个新的 screen 会话
./your_program          # 在 session 中运行程序

使用 Ctrl+A D 可以将程序送入后台继续运行,之后你可以用 screen -r my_session 恢复会话。

tmux 的使用方式类似,可以灵活管理多个终端会话。


根据你的需求,上述方法能够满足不同场景下让程序持续运行的要求,选择合适的方式即可。