自学内容网 自学内容网

服务器中要让 C++ 程序退出后自动重新运行

1. 使用 while 循环

最简单的方法是在一个脚本中使用 while 循环不断运行程序。如果程序退出,循环会重新启动它。

示例 Shell 脚本
#!/bin/bash

while true; do
    ./my_program   # 运行你的 C++ 程序
    if [ $? -ne 0 ]; then
        echo "Program exited with non-zero status, restarting..."
    else
        echo "Program exited normally, restarting..."
    fi
    sleep 1  # 等待1秒后重启(可以根据需要调整)
done

在这个例子中,my_program 是你的 C++ 可执行文件名。程序结束后,不管是否异常退出,都会重新启动。

使用步骤
  1. 将这个脚本保存为 restart.sh
  2. 赋予执行权限:
    chmod +x restart.sh
    

  3. 使用以下命令运行脚本:
    ./restart.sh

2. 使用 systemd 服务管理器(Linux 系统)

systemd 是 Linux 系统上常用的服务管理器,你可以创建一个 systemd 服务,让程序崩溃后自动重新启动。

创建 systemd 服务文件
  1. 创建一个服务文件 /etc/systemd/system/my_program.service

    [Unit]
    Description=My C++ Program Service
    After=network.target
    
    [Service]
    ExecStart=/path/to/my_program    # 你的 C++ 可执行文件路径
    Restart=always                   # 总是重新启动程序
    RestartSec=5                     # 等待 5 秒后重启
    StandardOutput=syslog            # 可选:输出日志到系统日志
    StandardError=syslog             # 可选:输出错误到系统日志
    
    [Install]
    WantedBy=multi-user.target
    

  2. 保存文件后,重新加载 systemd 配置:

    sudo systemctl daemon-reload
  3. 启动并启用服务,使其开机自动运行:

    sudo systemctl start my_program sudo systemctl enable my_program
systemd 方式的好处
  • 自动处理程序的重启,包括在系统重启时启动程序。
  • 可以监控服务状态,使用 systemctl status my_program 查看。
  • 程序崩溃时会自动重启,且可以设置重启延迟。

3. 使用 cron 定时任务(如果定期检查)

你也可以使用 cron 定时检查程序是否运行,并在它停止时重启。这种方法适合你希望定期检查而不是立即重新启动。

  1. 打开 cron 编辑器:

    crontab -e

  2. 添加以下内容,每隔一分钟检查一次程序是否在运行:

    * * * * * pgrep my_program > /dev/null || /path/to/my_program
    

在这个例子中,pgrep my_program 会检查程序是否正在运行。如果程序未运行,pgrep 将返回非零状态,从而执行 my_program 以重新启动它。

4. 在程序中实现自我重启机制

你可以让程序自身在遇到特定错误或退出条件时自动重新启动。通过调用 exec 函数,C++ 程序可以在结束前重新执行自身。

示例代码:
#include <iostream>
#include <unistd.h> // For exec and sleep

int main() {
    while (true) {
        // 执行你的程序逻辑
        std::cout << "Running program..." << std::endl;
        
        // 模拟程序退出或崩溃
        if (/* 条件,例如某个错误发生 */ false) {
            std::cout << "Program exiting..." << std::endl;
            break;
        }
        
        // 暂停一段时间,模拟工作
        sleep(5);
    }

    // 自我重启
    std::cout << "Restarting program..." << std::endl;
    execl("/path/to/my_program", "my_program", NULL);

    return 0;
}

execl 函数会用新的可执行文件覆盖当前进程,实现自我重启。在重启时,进程 ID 会保持不变,但程序会重新开始。

总结

  • 简单循环重启:使用 Shell 脚本。
  • 系统级守护:使用 systemd,适合在 Linux 服务器中长期运行服务。
  • 定时任务:使用 cron 定期检查程序状态。
  • 自我重启:程序内嵌重启逻辑。

原文地址:https://blog.csdn.net/laocui1/article/details/142778932

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!