Linux编写systemd service服务

systemd是一个Linux系统下的初始化系统(init system)和服务管理器(service manager),由Lennart Poettering带头开发,并在LGPL 2.1及其后续版本许可证下开源发布。其开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时降低Shell的系统开销,最终代替常用的System V与BSD风格init程序。


systemd不仅负责启动操作系统,还接管了后台服务、结束、状态查询以及日志归档、设备管理、电源管理、定时任务等许多职责。它支持通过特定事件(如插入特定USB设备)和特定端口数据触发的按需(On-demand)任务。此外,systemd具有一系列特性,如支持并行化任务、采用Socket激活式与D-Bus总线激活式服务、按需启动守护进程、利用Linux的cgroups监视进程、支持快照和系统恢复、维护挂载点和自动挂载点,以及各服务间基于依赖关系进行精密控制等。


在systemd中,后台服务具有特殊的身份,即它是系统中PID值为1的进程。它提供了服务按需启动的能力,使得特定的服务只有在真正被请求时才启动。对于用户自定义的服务,systemd允许配置其启动依赖项目,从而确保服务按必要的顺序运行。
检视和控制systemd的主要命令是systemctl。总的来说,systemd是一个功能强大的系统和服务管理器,能够极大地提高Linux系统的启动速度和运行效率。

以下是关于systemd的详细概念及功能的描述:

概念

  1. 初始化系统:systemd作为Linux内核启动后的第一个进程(PID为1),负责管理和协调系统初始化过程中的各个服务。
  2. 服务管理器:它不仅管理系统的启动过程,还负责在系统运行时管理服务(如守护进程)的状态,确保它们按照正确的顺序启动、停止或重启。

功能

  1. 并行化启动:与SysV-init不同,systemd允许更多的服务并行启动,而不是依次执行启动脚本,从而提高了系统启动速度。
  2. 依赖管理:systemd能够识别服务间的依赖关系,确保服务按照必要的顺序启动和停止。用户还可以自定义服务的依赖关系。
  3. Socket与总线激活服务:为了提高服务的并行运行性能,systemd采用Socket激活式和总线激活式服务。
  4. 进程追踪与控制:systemd使用cgroups代替PID来追踪进程,确保即使是两次fork之后生成的守护进程也不会脱离其控制。
  5. 按需启动:systemd提供了服务按需启动的能力,使得特定的服务只有在真正被请求时才启动,进一步降低了系统资源消耗。
  6. 系统状态与日志管理:systemd能够监视和控制系统状态,记录并管理系统日志,方便管理员查看和调试系统问题。
  7. 其他功能:除了上述功能外,systemd还支持快照和系统恢复、维护挂载点和自动挂载点、管理网络配置、网络时间同步、日志转发和名称解析等任务。此外,它还可以运行容器和虚拟机,并管理电源管理、定时任务等。

总的来说,systemd是一个功能强大且全面的系统初始化系统和服务管理器,它通过提供优秀的框架和强大的功能,使得Linux系统的管理和维护变得更加简单、高效和可靠。

service配置文件字段

unit部分

  • Description:指定当前服务的简单描述。
  • Documentation:指定服务的文档位置,可以是一个或多个文档的URL。
  • After 和 Before:定义服务的启动顺序,表示当前服务应该在哪些服务之后或之前启动。注意,这两个字段只涉及启动顺序,不涉及依赖关系。
  • Wants:表示当前服务与另一个服务之间存在弱依赖关系。如果另一个服务启动失败或停止运行,不影响当前服务继续执行。
  • Requires:表示当前服务与另一个服务之间存在强依赖关系。如果另一个服务启动失败或异常退出,当前服务也必须退出。
  • Conflicts:定义与当前服务冲突的服务。如果冲突的服务已经启动,那么当前服务就不能启动,反之亦然。

service部分:

  • ExecStart:定义服务启动时要执行的命令。
  • ExecStop:定义服务停止时要执行的命令。
  • ExecStartPre 和 ExecStopPost:定义服务启动前和停止后要执行的命令。
  • WorkingDirectory:指定服务的工作目录。
  • User 和 Group:指定服务运行的用户和组。
  • Restart 和 RestartSec:定义服务的重启策略,如是否自动重启、重启间隔等。

install部分:

  • WantedBy 和 RequiredBy:定义哪些服务或目标需要或要求当前服务。
  • Alias:为服务定义别名。

service脚本样例:

[Unit]  
Description=My Service Description  
After=network.target  
Requires=another-service.service 
Before=nss-lookup.target 
Wants=network-online.target nss-lookup.target 
  
[Service]  
Type=simple  
ExecStart=/path/to/my-service-executable  
ExecStop=/path/to/my-service-stop-script  
Restart=on-failure  
User=myserviceuser  
Group=myservicegroup  
WorkingDirectory=/path/to/my-service-working-directory  
  
[Install]  
WantedBy=multi-user.target

 service服务相关操作指令

启动服务:

systemctl start 服务名

停止服务:

systemctl stop 服务名

重启服务:

systemctl restart 服务名

查看服务状态:

systemctl status 服务名

设置服务开机自启:

systemctl enable 服务名

禁止服务开机自启:

systemctl disable 服务名

重新加载服务配置:

systemctl reload 服务名

下面通过简单的示例来演示如何编写systemd服务脚本

创建一个单调定时器

1.systemd 定时器【第一种方法】

编写任务脚本文件 以下是一个简单的引导区备份脚本/usr/local/bin/boot_backup内容如图

利用命令vim打开脚本

Vim /usr/local/bin/boot_backup

授予脚本执行权限,通过以下命令实现

编写一个配套的服务单元文件,将其命名为boot_backup.service保存在/etc/system/system目录中,内容如图

Type值设置为simple(默认值)

ExecStart定义要执行的任务

Vim boot_backup.service打开脚本

编写一个定时器单元文件,将其命名为boot_backup.timer保存在/etc/system/system目录中,内容如下图

Vim boot_backup.timer打开脚本

使脚本生效

完成服务脚本的编写后,需要执行以下命令重新加载所有systemd服务

Systemctl daemon-reload 重新装载单元文件

分别执行以下命令使新建的定时器能开机启动,并启动定时器

如上图启动的是.timer文件,而不是.service文件

因为配套的service文件有timer文件启动

执行命令systemctl list-timers列出定时器

2.使用cron安排周期性任务【第二种方法】

1)使用配置文件/etc/crontab 来管理系统级系统任务调度。

vi /etc/crontab

*上图的五个“*(通配符)按顺序对应的含义为:

  分钟(m)小时(h)日期(dom)月份(mon)星期(dow) #定义任务调度

计划时间数字取值范围:

·分钟(0~59)

·小时(0~23)

·日期(1~31)

·月份(1~12)

·星期(0~7,0或7代表星期日)

字符“-”表示数值区间;逗号“,”用于多个数值列表;正斜线“/”用来指定间隔频率。

例:“*/3”或“1-12/3”在月份字段表示每3个月;“*/5”或'0-59/5"在分钟字段表示每5分钟

·第六个字段表示执行命令的用户名,最后一个字段是要执行的命令

2)在etc/cron.d 目录中定义个别的周期性任务

·定制更为灵活、更具个性的计划任务

在/etc/cron.d/目录中添加自己的配置文件,格式同/etc/crontab

3)使用crontab命令为普通用户定制任务调度

上述命令需要root用户进行配置,crontab命令为普通用户提供调度时间的服务,可以创建和维护自己的cron配置文件。

crontab [-u 用户名] [-e|-l|-r]

 选项 -u 指定要定义任务调度的用户名,没有则为当前用户;-e 用于编辑文件;-l 用于显示文件的内容;-e 用于删除文件

·没有列入/etc/cron.deny 文件中的linux用户可以直接执行contab -e 进入vi编辑界面,每行定义一个任务调度

·crontab命令生成的cron调度文件位于/var/spool/cron/目录

 ·可以通过/var/spool/cron/、/etc/cron.allow文件限制对cron服务的使用

3.使用at工具安排一次性任务

(1)在命令行中执行at命令进入作业设置状态。 at后面跟时间参数,即要执行任务的时间,可以是下面格式中任何一种。 
·HH:MM:某一时刻,如05:00 代表5:00 AM。如果时间已过,就会在第2天的这一时间执行。 


·MMDDYY、MM/DD/YY或MM.DD.YY:日期格式,表示某年某月某天的当前时刻。 
·月日年英文格式:如 January 15201 5,年份可选。 
·特定时间:midnight代表12:00 AM; noon代表12:00 PM; teatime代表4:00 PM。 
·now+:从现在开始多少时间以后执行,单位是minutes、 hours、 days或weeks。如now +3 days代表命令应该在3天之后的当前时刻执行。 
(2)出现at>提示符,进入命令编辑状态,设置要执行的命令或脚本。可指定多条命令, 每输入一条命令,按<Enter>键。 
(3)需要结束时按<Ctr>+D>组合键退出。 
(4)可根据需要执行命令ata查看等待运行(未执行)的作业。 
(5)如果需要取消at作业,可以在atrm命令后跟atg命令输出的作业号,将该at 作业删除。 
下面给出一个简单的at配置:

at now + 10minutes

列出:

atq

删除atrm 2 :

atrm 2

对比

  at定时器主要是一次性的任务调度器,它允许用户在指定的时间点执行一次任务。这意味着,当你设置了一个at任务后,它会在指定的时间点执行一次,然后就不会再自动执行了。

  cron定时器则基于时间的任务调度器,它允许用户在指定的时间点或时间间隔内执行任务。cron是由cron守护进程管理的,这个守护进程在系统启动时就会启动并在后台一直运行。它会读取特定的配置文件,如/etc/crontab/etc/cron.d目录下的文件,来确定要执行的任务和执行的时间间隔。一旦到达任务设定的时间,cron就会执行相应的命令或脚本。此外,cron通常用于Linux系统中的计划任务,可以设置为开机时自动启动。

 systemd定时器由两部分组成:定时器单元(.timer文件)和关联的服务单元(.service文件)。定时器单元指定何时执行任务,而关联的服务单元定义了要执行的任务或服务。

  因此,at定时器更适合于一次性任务,而cron定时器、systemd定时器则更适用于需要定期或重复执行的任务。

  • 24
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值