Systemd是Linux系统工具,其作用是守护进程,如今已经成为了大多数Linux发行版本(如Ubuntu、Debian等系统)的自带工具。
历史上,Linux的启动一直采用init进程,该方法启动时间长,且执行的启动脚本十分复杂。为了给系统启动和管理提供一套完善的解决方案,Lennart Poettering设计出了Systemd取代init。其功能十分强大,但体系也十分复杂。下图为Systemd的架构图:
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 blame
# 显示瀑布状的启动过程流
$ systemd-analyze critical-chain
# 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service
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
若终端若出现如下图中的红灯则表示程序运行失败。
若出现如下图中的绿灯即表示启动成功。
5. 服务的修改与重载
sudo systemctl daemon-reload
当新添加 unit 配置文件(这里为开机自启动的 service 文件)后,需要执行 daemon-reload 子命令
有 unit 配置文件发生变化时,也需要执行 daemon-reload 子命令
喜欢的话可以关注一下我的公众号技术开发小圈,尤其是对深度学习以及计算机视觉有兴趣的朋友,我会把相关的源码以及更多资料发在上面,希望可以帮助到新入门的大家!