Ubuntu平台使用systemd服务实现进程的开机启动

Ubuntu平台使用systemd服务实现进程的开机启动

文章目录


前言

本文记录在Ubuntu系统使用systemd实现进程的开机启动,并管理这个进程,当系统重启或者进程意外崩溃时能重新开启这个进程。


一、使用 systemd 服务管理器

systemd 是大多数现代 Linux 发行版中默认的系统和服务管理器,可以用来管理系统启动时的服务。其他可以实现开机启动的方式有:

1,使用 'cron' 定时任务;

2,在 '.bashrc' 或 '.profile' 中添加启动命令;

3,使用 '/etc/rc.local';

systemd 是推荐的方式,特别是在现代 Linux 发行版上。它更灵活、更强大,也可以更好地控制服务的启动和停止。如果使用较老的 Linux 发行版或者需要更简单的解决方案,可以考虑 cron 或 rc.local等。

1.创建systemd文件

bash 复制代码
[Unit]
Description=AI skynet Service
After=network.target

[Service]
ExecStart=/usr/local/zrodo/skynet/mydaemon
Type=forking
PIDFile=/var/run/mydaemon.pid
Restart=always
RestartSec=10
User=root
Group=root

[Install]
WantedBy=multi-user.target

其中:

Description对服务的简短描述。

After=network.target:确保在网络服务启动后才启动该服务(如果不依赖网络,可以移除这一行)。

ExecStart 是要启动的应用程序的路径。

Restart 设定为 always,当进程意外退出时会自动重启。

User 和 Group 是运行服务的用户和组(可以省略,默认为 root)。

Restart=always: 无论退出状态是什么,总是重新启动服务。

RestartSec=10: 服务重启的时间间隔为10秒,避免过于频繁的重启。

Type=forking: 适用于程序在启动时 fork 出一个子进程,并且父进程退出的情况。在这种情况下,需要确保 mydaemon 能正确生成一个 PID 文件。

PIDFile如果进程在启动后生成了一个 PID 文件(通常用于守护进程模式),需要指定这个 PID 文件的路径。systemd 会使用这个 PID 文件来跟踪服务的主进程。

确保你的程序确实生成了这个 PID 文件,并且路径正确。如果你的程序不生成 PID 文件,你可以忽略这一行,但可能会导致 systemd 无法正确管理进程。

Type=simple: 适用于程序不 fork 的情况,即程序不会生成新的子进程,而是直接在前台运行。
关键点

自动重启:Restart=always 使服务在任何情况下(崩溃或手动停止)都会自动重启。

定期检查:systemd 通过内部机制(如 RestartSec)来管理服务的重启和检查,不需要额外编写脚本来检查进程状态。

2.生成pid文件

在进程代码中加入如下两个生成和移除pid文件的方法,路径:"/var/run/mydaemon.pid"

bash 复制代码
void create_pid_file(const std::string &pid_file_path) {
    std::ofstream pid_file(pid_file_path);
    if (pid_file.is_open()) {
        pid_file << getpid() << std::endl;
        pid_file.close();
    } else {
        std::cerr << "Unable to create PID file: " << pid_file_path << std::endl;
    }
}

void remove_pid_file(const std::string &pid_file_path) {
    std::remove(pid_file_path.c_str());
}

关键步骤解释:

create_pid_file这个函数用于创建一个指定路径的 PID 文件,并将当前进程的 PID 写入其中。这里使用了 getpid() 函数获取当前进程的 PID。

remove_pid_file当进程正常退出时,这个函数用于删除 PID 文件。这样可以确保不留下过时的 PID 文件。

另外:

进程中还需要使用 fork() 函数将进程从控制台中分离出来。如果 fork 成功,父进程退出,子进程继续运行。

PID 文件通常放在 /var/run/ 或 /run/ 目录下。你需要确保进程有权限在这个目录下创建文件。

3.启动服务

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl enable mydaemon.service
sudo systemctl start mydaemon.service

4.检查服务状态和日志

bash 复制代码
sudo systemctl status mydaemon.service
journalctl -xe -u mydaemon.service
相关推荐
likfishdn12 分钟前
Linux的文件与目录管理
linux·运维·服务器
chian-ocean32 分钟前
Linux 文件缓冲区:高效数据访问的幕后推手
linux·运维·服务器
加油=^_^=33 分钟前
【Linux】进程优先级 | 进程调度(三)
linux·运维·服务器
若云止水42 分钟前
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(4)
数据库·nginx·ubuntu
吃汤圆的抹香鲸1 小时前
GoLand 安装包 绿色版 Win,Mac,Linux 包含IntelliJ全家桶 专为Go语言设计的集成开发环境(IDE)
linux·windows·macos·go·intellij-idea·go1.19
追寻光1 小时前
Cannot find a valid baseurl for repo: base/7/x86_64
linux
元气满满的热码式1 小时前
Docker数据卷操作实战
linux·运维·docker·云原生·容器
陆沙1 小时前
deepseek-r1-centos-本地服务器配置方法
linux·服务器·centos
北京耐用通信1 小时前
航空装配自动化神器Ethercat转profient网关搭配机器人精准控制
运维·机器人·自动化
吃汤圆的抹香鲸2 小时前
Rider 安装包 绿色版 Win/Mac/Linux 适合.NET和游戏开发者使用 2025全栈开发终极指南:从零配置到企业级实战
linux·运维·windows·sql·游戏·macos·.net