文章目录

  • 背景
  • Systemd常用命令
  • systemctl
  • systemd-analyze
  • hostnamectl
  • 创建开机自启且被守护的系统服务
  • 后续


背景

Systemd是Linux系统工具,其作用是守护进程,如今已经成为了大多数Linux发行版本(如Ubuntu、Debian等系统)的自带工具。

 历史上,Linux的启动一直采用init进程,该方法启动时间长,且执行的启动脚本十分复杂。为了给系统启动和管理提供一套完善的解决方案,Lennart Poettering设计出了Systemd取代init。其功能十分强大,但体系也十分复杂。下图为Systemd的架构图:

systemd 启动报错 手动启动正常 systemd启动服务_systemd

Systemd常用命令

systemctl

systemctl是其中比较主要的命令,用于管理系统,常见的命令有:

# 重启系统
sudo systemctl reboot

# 关闭系统
sudo systemctl poweroff

# CPU 停止工作
sudo systemctl halt

# 暂停系统
sudo systemctl suspend

# 使能某个系统服务
sudo systemctl enable service服务名

# 执行系统服务
sudo systemctl start service服务名

# 停止系统服务
sudo systemctl stop service服务名

# 杀死系统服务
sudo systemctl kill service服务名

# 重载所有修改过的配置文件
sudo systemctl daemon-reload

# 显示某个 Unit 的所有底层参数
sudo systemctl show service服务名

systemd-analyze

systemd-analyze命令常用于查看启用耗时、启动流等信息

# 查看启动耗时
$ systemd-analyze                                                                           
# 查看每个服务的启动耗时
$ systemd-analyze blame

# 显示瀑布状的启动过程流
$ systemd-analyze critical-chain

# 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service

hostnamectl

hostnamectl命令常用于查看当前主机相关的各类信息

# 显示当前主机的信息
$ hostnamectl

# 设置主机名。
$ sudo hostnamectl set-hostname rhel7

创建开机自启且被守护的系统服务

 在进行linux开发时,我们常需要在系统启动时自动运行某项系统服务,以满足其执行特定的功能。Ubuntu系统的systemd服务文件都储存在/lib目录下,所以首先要在**/lib/systemd/system**下新建系统服务,按照以下步骤(以start.service为例):

1. 新建service服务

cd /lib/systemd/system

#新建service服务
sudo gedit start_run.service

2. 在新建的service服务文件中键入

[Unit]
Description=DownSentry Programme
[Service]
ExecStart=-/usr/local/sbin/xxx.sh
ExecReload=-/usr/local/sbin/xxx.sh
Restart=always
RestartSec=42ms
[Install]
WantedBy=multi-user.target

Description:描述,相当于readme.md,内容任意

ExecStart:启动服务时执行的命令

ExecReload:重启服务时执行的命令

Type:启动类型,simple(默认值):ExecStart字段启动的进程为主进程

Restart:on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启服务

RestartSec:重启服务前的等待时间

WantedBy:表示该服务所在的 Target,有以下两种

multi-user.target:多用户命令行状态,不需要执行opencv中imshow或者namedWindow等打开图像界面,同时支持多个用户同时登陆并执行进程的状态;

graphical.target:图形用户状态,需要执行opencv中imshow或者namedWindow等打开图像界面的状态

3. 设置开机自启并启动

# 设置开机启动
sudo systemctl enable start_run  

# 启动服务
sudo systemctl start start_run

4. 验证是否已启动

# 终端执行
sudo systemctl status start_run

 若终端若出现如下图中的红灯则表示程序运行失败。

systemd 启动报错 手动启动正常 systemd启动服务_系统服务_02

 若出现如下图中的绿灯即表示启动成功。

systemd 启动报错 手动启动正常 systemd启动服务_linux_03

5. 服务的修改与重载

sudo systemctl daemon-reload

 当新添加 unit 配置文件(这里为开机自启动的 service 文件)后,需要执行 daemon-reload 子命令

 有 unit 配置文件发生变化时,也需要执行 daemon-reload 子命令