首页 > 其他分享 >自定义的 systemd 服务启动方式

自定义的 systemd 服务启动方式

时间:2024-08-02 10:55:19浏览次数:15  
标签:systemd log service 启动 sudo 日志 my 自定义

目录

systemd 单元文件(Unit File)

单元文件结构

示例单元文件

1. 基础单元文件

2. 带有环境变量的单元文件

3. 自定义的 ExecStartPre 和 ExecStartPost

配置管理

日志管理

1. 系统日志:

2. 应用程序日志:

3. 用户日志:

使用prometheus配置实例

1. 配置prometheus

2. 配置alertmanager

3. 配置node_exporter 

4. 配置prometheus-webhook-dingtalk


在大多数 Linux 发行版中,用户自定义的 systemd 服务单元文件通常放在 /etc/systemd/system/ 目录下,而系统提供的服务单元文件通常放在 /usr/lib/systemd/system/

systemd 是现代 Linux 系统上广泛使用的初始化系统和服务管理器。使用 systemd 配置和管理服务非常高效。以下是 systemd 启动方式配置的基本介绍和示例:

systemd 单元文件(Unit File)

systemd 使用单元文件来定义服务、套接字、设备等。单元文件通常位于以下目录:

  • /etc/systemd/system/ - 用户自定义的单元文件
  • /lib/systemd/system//usr/lib/systemd/system/ - 系统包提供的单元文件

单元文件结构

一个单元文件包含以下几个部分:

  1. [Unit]:描述单元的基本信息和依赖关系。
  2. [Service]:定义服务的行为。
  3. [Install]:指定服务的启动和停止条件。

示例单元文件

1. 基础单元文件

这是一个简单的服务单元文件示例,配置了 my_service 服务:

[Unit]
Description=My Custom Service
After=network.target

[Service]
ExecStart=/usr/bin/my_service
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target
  • [Unit]

    • Description: 服务的描述。
    • After: 指定服务的启动顺序,network.target 表示服务在网络配置之后启动。
  • [Service]

    • ExecStart: 启动服务的命令。
    • ExecReload: 重载服务的命令。
    • Restart: 服务失败时的重启策略,例如 on-failure 表示失败时重启。
  • [Install]

    • WantedBy: 指定服务应在什么目标(target)下启动,multi-user.target 表示在多用户模式下启动。
2. 带有环境变量的单元文件

如果需要设置环境变量,可以使用 EnvironmentFileEnvironment 指令:

[Unit]
Description=My Service with Environment Variables
After=network.target

[Service]
ExecStart=/usr/bin/my_service
EnvironmentFile=/etc/my_service/my_service.env
Restart=on-failure

[Install]
WantedBy=multi-user.target

  • EnvironmentFile: 从指定文件加载环境变量。
3. 自定义的 ExecStartPre 和 ExecStartPost

可以在服务启动前或启动后执行其他命令:

[Unit]
Description=My Service with Pre and Post Commands
After=network.target

[Service]
ExecStartPre=/usr/bin/pre_start_command
ExecStart=/usr/bin/my_service
ExecStartPost=/usr/bin/post_start_command
Restart=on-failure

[Install]
WantedBy=multi-user.target

  • ExecStartPre: 启动服务之前执行的命令。
  • ExecStartPost: 启动服务之后执行的命令。

配置管理

  1. 重新加载配置

    在修改单元文件后,需要重新加载 systemd 配置:

    sudo systemctl daemon-reload
    

  2. 启动和停止服务

    启动、停止和重启服务的命令:

    sudo systemctl start my_service
    sudo systemctl stop my_service
    sudo systemctl restart my_service
    

  3. 启用和禁用服务

    启用服务以便在系统启动时自动启动:

    sudo systemctl enable my_service
    

    禁用服务以防止自动启动:

    sudo systemctl disable my_service
    

  4. 检查服务状态

    查看服务的当前状态:

    sudo systemctl status my_service
    

日志管理

使用 journalctl 查看服务日志:

sudo journalctl -u my_service

如果 systemd-journald 未配置为持久存储,日志会存储在内存中。日志文件位于: 

/run/log/journal/
#这个目录是临时的,每次系统重启后内容都会丢失。 

一些常见的日志文件和目录在 /var/log 中包括:

1. 系统日志
  • /var/log/messages:包含系统的通用日志信息,记录了大多数系统服务和内核的消息。
  • /var/log/syslog:在某些系统上(如 Debian/Ubuntu),包含系统和应用程序的日志消息。
  • /var/log/dmesg:内核环缓冲区的日志,通常包括系统启动时的消息。
2. 应用程序日志:
  • /var/log/httpd//var/log/apache2/:Apache HTTP 服务器的日志。
  • /var/log/nginx/:Nginx 服务器的日志。
  • /var/log/mysql//var/log/mariadb/:MySQL 或 MariaDB 数据库的日志。
  • /var/log/postgresql/:PostgreSQL 数据库的日志。
3. 用户日志
  • /var/log/auth.log/var/log/secure:记录身份验证和授权相关的日志。

 

使用prometheus配置实例

 

1. 配置prometheus
sudo tee /etc/systemd/system/prometheus.service > /dev/null <<EOF
[Unit]
Description=Prometheus
# 确保 Prometheus 在网络服务启动后再启动
After=network.target

[Service]
# 以 root 用户身份运行 Prometheus 服务
User=root
Group=root
# 服务类型为 simple,表示服务的主要进程是 ExecStart 中指定的进程
Type=simple
# 启动 Prometheus,指定配置文件和数据存储路径
ExecStart=/opt/prometheus/prometheus \\
    --config.file=/opt/prometheus/prometheus.yml \\
    --storage.tsdb.path=/opt/prometheus/data
# 重新加载配置时发送 HUP 信号给主进程
ExecReload=/bin/kill -HUP \$MAINPID
# 服务失败时自动重启
Restart=on-failure

[Install]
# 在 multi-user.target 启动时启动此服务
WantedBy=multi-user.target
EOF
2. 配置alertmanager
sudo tee /etc/systemd/system/alertmanager.service > /dev/null <<EOF
[Unit]
Description=Alertmanager
# 依赖于 network.target 服务在启动时
After=network.target

[Service]
# 以 root 用户身份运行
User=root
Group=root
# 服务类型为 simple,即服务的主要进程是 ExecStart 中指定的进程
Type=simple
# 启动 Alertmanager,指定配置文件和数据存储路径
ExecStart=/opt/alertmanager/alertmanager \
    --config.file=/opt/alertmanager/alertmanager.yml \
    --storage.tsdb.path=/opt/alertmanager/data
# 重新加载配置时发送 HUP 信号给主进程
ExecReload=/bin/kill -HUP \$MAINPID
# 服务失败时自动重启
Restart=on-failure

[Install]
# 在 multi-user.target 启动时启动此服务
WantedBy=multi-user.target
EOF
3. 配置node_exporter 
sudo tee /etc/systemd/system/node_exporter.service > /dev/null <<EOF
[Unit]
Description=Node Exporter
# 确保 Node Exporter 在网络服务启动后再启动
After=network.target

[Service]
# 以 root 用户身份运行 Node Exporter 服务
User=root
Group=root
# 服务类型为 simple,表示服务的主要进程是 ExecStart 中指定的进程
Type=simple
# 启动 Node Exporter,指定其二进制文件路径
ExecStart=/opt/node_exporter/node_exporter
# 服务失败时自动重启
Restart=on-failure

[Install]
# 在 multi-user.target 启动时启动此服务
WantedBy=multi-user.target
EOF
4. 配置prometheus-webhook-dingtalk
sudo tee /etc/systemd/system/prometheus-webhook-dingtalk.service > /dev/null <<EOF
[Unit]
Description=Prometheus Webhook for DingTalk
# 确保 Prometheus Webhook for DingTalk 在网络服务启动后再启动
After=network.target

[Service]
# 以 root 用户身份运行 Prometheus Webhook for DingTalk 服务
User=root
Group=root
# 服务类型为 simple,表示服务的主要进程是 ExecStart 中指定的进程
Type=simple
# 启动 Prometheus Webhook for DingTalk,指定其二进制文件路径和配置文件路径
ExecStart=/opt/webhook-dingtalk/prometheus-webhook-dingtalk \
    --config.file=/opt/webhook-dingtalk/config.yml
# 服务失败时自动重启
Restart=on-failure

[Install]
# 在 multi-user.target 启动时启动此服务
WantedBy=multi-user.target
EOF

注意:重新加载 systemd 配置 

sudo systemctl daemon-reload

标签:systemd,log,service,启动,sudo,日志,my,自定义
From: https://blog.csdn.net/Lzcsfg/article/details/140864887

相关文章

  • UE5-自定义插件使用第三方库
    制作插件使用到了第三方库,后面很长时间没有用这个插件,导致插件启用不了,吃亏了,所以记录下制作过程。第一步:在继承ModuleRules的C#脚本里添加代码:privatestringModulePath { get { returnModuleDirectory; } } privatestringThirdPartyPath { get{re......
  • WPF 自定义对话框
    <Windowx:Class="WPFDemo2.窗体.CustomDialogWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas......
  • Photos框架 - 自定义媒体选择器(相册列表)
    ​​​​​​​Photos框架-自定义媒体资源选择器(数据部分)Photos框架-自定义媒体选择器(UI列表)​​​​​​​Photos框架-自定义媒体选择器(UI预览)Photos框架-自定义媒体选择器(相册列表)引言我们已经实现了媒体资源的列表选择以及媒体资源的大图预览功能,但通常一个......
  • clion 《cmake自定义静态库后,生成的exe无法运行》
    背景项目生成lib引入,在生成exe过程中无法正常运行处理办法让链接器静态链接GCC和C++标准库set(CMAKE_EXE_LINKER_FLAGS"-static-libgcc-static-libstdc++")主CMakeLists.txtcmake_minimum_required(VERSION3.28)project(speech)#编译版本set(CMAKE_CXX_STANDAR......
  • 【C#】WPF自定义Image实现图像缩放、平移
    1.xaml实现<UserControlx:Class="HalconDemo.ImageUserControl"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://sche......
  • 企业微信 启动错误 0xc0000142
    废话不多说,上教程。......
  • 自定义Django后台admin
    Django后台自定义一、AdminSite1、AdminSite属性AdminSite属性属性描述site_header管理页面顶部的文字,默认是‘Django管理’site_title<title>末尾放置的文字site_url‘查看网站’链接的urlindex_title管理索引页顶部的文字index_template自定义主要......
  • Flutter 自定义画笔案例
    首先让我们来看下这张图当UI做的设计图中有这么一个元素,我想大多数人第一反应就是叫UI切图,然后直接使用Image加载,我一开始也是这么做的,毕竟省时省力省心。但是由于后面需要针对不同的状态设置不同的颜色,我不想写过多判断语句来切换图标(我目前的做法是实现一个枚举类,然后拓展该......
  • el-progress 自定义线状进度条右边的文字
    需要展示类似下面的效果 搜了很多slot的方式试了都不行,好像是因为我后面的文字太长了导致了换行,加上这边需要加其他的样式,最后干脆将原始的文字变成空的,自己写右边的文字加样式了<divstyle="margin:10px020px0"v-f......
  • 关键错误:“工具”。 CrewAI 在制作自定义工具时出错?
    我开发了一个团队来从不同的URL获取一些信息。到目前为止总共有大约3个URL,所以我创建了5个代理。1是编辑器(经理),1是其他3个带到表中的所有数据的编译器。如果这有帮助的话,这是我的文件夹结构university_scraper/│├──src/│├──__init__.py│......