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
相关推荐
AuroraDPY3 分钟前
Linux 环境变量
linux·运维·服务器
Ronin30522 分钟前
【Linux系统】进程切换 | 进程调度——O(1)调度队列
linux·运维·服务器·ubuntu
万象.29 分钟前
Linux多进程
linux
苦瓜汤补钙43 分钟前
论文阅读:WildGS-SLAM:Monocular Gaussian Splatting SLAM in Dynamic Environments
linux·论文阅读·机器学习
Kevin Wang7271 小时前
Ubuntu服务器安装Miniconda
linux·服务器·ubuntu
Jinxiansen02111 小时前
TypeScript 中的内置工具类型(Utility Type)
javascript·ubuntu·typescript
小米里的大麦2 小时前
021 多语言协同执行(了解)
linux
冬夜戏雪3 小时前
阿里云ubuntu安装mysql docker容器(拉,运行,测试完整版)
mysql·ubuntu·阿里云
甲方求你学点技术吧3 小时前
8:从USB摄像头把声音拿出来--ALSA大佬登场!
linux·图像处理·ffmpeg·音视频
药9553 小时前
网络编程(TCP连接)
运维·服务器