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
相关推荐
-指短琴长-2 分钟前
Linux从0到1——线程同步和互斥【互斥量/条件变量/信号量/PC模型】
linux·运维·服务器
梦呓01043 分钟前
platform_msi使用
linux
A charmer10 分钟前
畅游 Linux 开发天地:yum 与 vim 详解
linux·运维·服务器
梦想画家26 分钟前
Ubuntu安装Apache Airflow详细指南
ubuntu·数据集成·airflow
白了个白i28 分钟前
多个方向说下nginx和apache的区别
运维·nginx·apache
TIANGEKUAJING33 分钟前
为什么推荐企业租赁IT设备?
运维·网络·it租赁·it设备租赁·企业it设备租赁
小吴-斌39 分钟前
Ubuntu 中安装 RabbitMQ 教程
linux·ubuntu·rabbitmq
夜泉_ly41 分钟前
Linux -Vim
linux·vim
黑子哥呢?44 分钟前
linux自动化一键批量检查主机端口
linux·服务器·自动化
m0_748240911 小时前
Linux系统下安装配置 Nginx 超详细图文教程
linux·运维·nginx