Linux 服务service(一)

一、服务入门

1.1 概述

  • 服务定义:服务(Service)是指在后台运行的程序或进程,它们通常用于执行特定的任务,如网络服务、日志记录、定时任务等。服务可以由系统在启动时自动运行,也可以根据需要手动启动或停止。
  • 服务文件:Systemd服务单元由.service文件定义,这些文件通常位于/etc/systemd/system/目录下。一个.service文件包含了启动、停止和维护服务所需的指令和配置。
  • 服务文件内容:
    • [Unit]部分:包含服务的元数据和依赖关系。
    • [Service]部分:定义服务的运行参数,如启动命令、工作目录、环境变量等。
    • [Install]部分:定义服务安装时的行为,如服务应该被哪个目标启动。
  • 服务状态
    • 启动(Started):服务正在运行。
    • 停止(Stopped):服务已停止运行。
    • 激活(Active):服务处于活动状态,可能是启动或停止状态

1.2 创建及管理Systemd服务

1.2.1 创建service文件

/etc/systemd/system/目录下创建

  • recordTime.service
    [Unit]
    # 任务描述:任务管理,status中会显示
    Description=记录时间
    
    [Service]
    # 服务类型:常规类型
    # 执行命令后系统则认为任务running中,直到用户显式关闭
    Type=simple
    # 服务启动后执行的命令(以下二选一),多语句分号分隔
    # 1、服务执行用户脚本:脚本可用shell,python,C++等编写
    # 2、服务执行系统命令:如 /usr/bin/date > /home/date_receive.txt
    ExecStart=/bin/bash /root/shellFolder/recordTime.sh
    
    [Install]
    # 启动后挂载在哪个目标之下
    WantedBy=multi-user.target
    
  • 增加读写权限chmod 644 /etc/systemd/system/recordTime.service

1.2.2 创建脚本文件

/root/shellFolder/目录下

  • recordTime.sh
    #!/bin/bash
    /usr/bin/date >> /home/shellFolder/date_receive.txt
    
  • 修改权限:chmod 700 recordTime.sh

1.2.3 管理Systemd服务

  • 重新加载Systemd配置:systemctl daemon-reload

    在创建或修改服务文件后需要执行

  • 日常操作
    功能命令
    查看已定义的所有服务systemctl list-units --type=target
    启动服务systemctl start recordTime.service
    重启服务systemctl restart recordTime.service
    停止服务systemctl stop recordTime.service
    查看服务状态systemctl status recordTime.service
    设置开机自启systemctl enable recordTime.service
    禁用服务开机自启systemctl disable recordTime.service
    查看服务日志journalctl -u recordTime.service

1.2.4 服务输出

  • 命令行交互
    -># systemctl daemon-reload
    -># systemctl start recordTime.service 
    -># cat date_receive.txt 
    ->Sun Mar 31 19:39:27 CST 2024
    -># systemctl enable recordTime.service 
    ->Created symlink /etc/systemd/system/multi-user.target.wants/recordTime.service → /etc/systemd/system/recordTime.service.
    -># systemctl status recordTime.service 
    ● recordTime.service - 记录时间
       Loaded: loaded (/etc/systemd/system/recordTime.service; enabled; vendor preset: disabled)
       Active: inactive (dead)
    
    	331 19:39:27 systemd[1]: Started 记录时间.
    	331 19:39:27 systemd[1]: recordTime.service: Succeeded.	
    

    重点输出:enable是开机启动,active因为只有一句,执行完就结束了,要是持续的服务,这里就会是active(running),再下面就是执行日志

  • 功能小记:因为开机启动,所以可以用来记录上次开机时间

1.3 服务文件常用参数

1.3.1 UNIT单元

  • 总括
    名称解释
    Description服务描述,说明服务的功能、目的
    Documentation提供服务文档的URL或路径,以便用户和管理员了解如何使用和维护服务
    After指定服务启动的顺序,服务将在列出的单元之后启动。例如,After=network.target表示服务将在网络服务启动后启动。
    Before参After
    Requires指定服务启动所需的其他服务单元。如果这些服务未运行,Systemd将尝试启动它们
    Wants指定服务希望启动的其他服务单元,但不强制要求。这是软依赖,即使这些服务未运行,也不会阻止当前服务的启动
    Refuses指定服务不希望启动的其他服务单元。这是用于防止某些服务启动的软策略
    BindsTo指定服务绑定到的其他服务单元。如果绑定的服务未运行,当前服务不会启动
    PartOf指定服务所属的更大的服务单元组。这通常用于表示服务是某个更大系统的一部分

    以上可接service文件如:recordTime.service或target见1.4

1.3.2 service单元

  • 总括(标记为必选项)
    名称功能
    Type定义服务的类型,例如simple、forking、oneshot、notify或dbus,Type指定了Systemd如何管理服务进程
    ExecStart指定启动服务时执行的命令或脚本。这是服务启动时运行的主要命令
    ExecStop指定停止服务时执行的命令或脚本。这个命令通常用于清理资源或正常关闭服务
    ExecReload指定重新加载服务配置时执行的命令。这通常用于应用服务配置的更改而不停止服务
    Restart定义服务失败时的重启策略,例如on-failure、always、never等
    RestartSec定义服务重启前的等待时间,单位是秒
    TimeoutStartSec定义服务启动超时的时间,单位是秒
    TimeoutStopSec定义服务停止超时的时间,单位是秒
    PIDFile指定服务进程ID文件的路径。Systemd将使用这个文件来跟踪服务的进程ID
    User指定运行服务的用户名称
    Group指定运行服务的用户组
    Environment设置服务运行时的环境变量
    EnvironmentFile指定一个文件,其中的键值对将被设置为服务的环境变量
    WorkingDirectory指定服务进程的工作目录
    StandardInput指定服务的标准输入源,例如tty或null
    StandardOutput指定服务的标准输出目标,例如journal、console或file
    StandardError指定服务的标准错误输出目标,通常与StandardOutput相同
    SuccessExitStatus定义服务进程退出时被认为是成功的退出状态码
    RemainAfterExit如果设置为yes,即使服务的主进程退出,Systemd也会认为服务仍在运行
  • Type详解
    名称解释
    simple这是默认的服务类型,适用于大多数服务。simple 类型的服务通常启动一个单一的进程,并且这个进程会一直运行直到被停止。Systemd会根据ExecStart指令启动服务,并在ExecStop指令指定的命令被执行时停止服务
    oneshot这种类型的服务执行一次性任务,启动后立即退出。Systemd会等待服务进程退出,然后自动认为服务已经启动并完成。oneshot 类型的服务通常用于不需要长时间运行的任务
    idle这种类型的服务在系统空闲时运行。它们通常用于执行不需要实时响应的任务,如系统维护或日志分析
    forking适用于传统的Unix守护进程,这些守护进程在启动时会fork一个子进程,然后父进程立即退出。Systemd会等待父进程退出,然后继续启动其他服务。如果父进程没有退出,Systemd会认为服务启动失败
    notify类似于simple,但服务进程会在完成初始化并准备好接收请求时发送一个通知。这允许Systemd更好地并行化服务的启动过程。如果服务没有发送通知,Systemd会认为服务启动失败

1.3.3 install单元

  • WantedBy
    • 这个指令指定了服务单元文件应该被安装到哪个或哪些.target文件的.wants目录下。当Systemd启动到达指定的.target时,它会查看该.target的.wants目录下的所有服务单元文件,并启动它们。
    • 例如,如果你想让服务在系统进入多用户文本模式时启动,你可以设置WantedBy=multi-user.target

1.4 target文件常用参数

  • .target文件的作用
    • 定义系统状态:.target文件定义了系统启动或运行时应该达到的状态,例如多用户模式、图形界面模式或维护模式。
    • 管理服务依赖:通过Requires和Wants指令,.target文件可以指定一组服务的启动顺序和依赖关系。
    • 控制服务的激活:通过WantedBy指令,.target文件可以控制服务是否应该在系统启动时自动激活
  • 常用总括
    名称解释
    graphical.target代表图形用户界面(GUI)的目标状态。在这个状态下,系统会启动X窗口系统和桌面环境,提供图形界面供用户操作。
    multi-user.target代表多用户文本模式的状态。在这个状态下,系统允许多个用户通过文本终端登录,但不启动图形界面。
    rescue.target用于系统恢复的目标状态。在这个状态下,系统会启动一个最小化的环境,通常用于修复系统问题或恢复丢失的数据。
    emergency.target用于紧急恢复的目标状态。当系统无法正常启动时,可以进入这个状态进行故障排除。在这个状态下,系统通常只提供基本的命令行界面。
    network.target网络服务已完成启动
  • 格式及位置:同service,只是没有[service]项,位置在/etc/systemd/system
  • 操作
    # 列出系统中所有已定义的目标单元
    systemctl list-units --type=target
    # 获取系统当前默认target
    systemctl get-default
    # 设置系统启动默认进入的target
    systemctl set-default multi-user.target
    

1.5 周期性任务timer

1.5.1 创建timer文件

/etc/systemd/system/目录下创建

  • recordTime.timer
    [Unit]
    Description=每五秒触发一次
    
    [Timer]
    OnUnitActiveSec=1m
    
    [Install]
    WantedBy=timers.target
    

    权限:不需添加权限,systemctl status recordTime.timer,可以直接查看

  • recordTime.service—同1.2.1

    timer\service同名:使用同名是一种方便的方法来管理和调度 systemd 服务
    timer\service异名:需在timer文件的Unit指定service,Unit=recordTime.service

1.5.2 管理timer文件

  • 生效:任务会在系统空闲时执行,不一定是上面写的就准时执行
  • 常规管理操作
    # 查看定时器状态
    systemctl start|stop|restart|status recordTime.timer
    # 查看所有定时器
    systemctl list-timers --all
    # 查看定时器的下一个激活时间
    systemctl show --property=NextElapse recordTime.timer
    

1.5.3 timer单元配置选项

  • 常用选项
    名称解释
    OnBootSec在系统启动后多少秒后执行任务(秒s,分m,时h,天d)
    OnUnitActiveSec在Service单元上次变为active状态后多久后再次执行任务(秒s,分m,时h,天d)
    OnCalendar基于日历时间执行任务,可以是绝对时间或相对时间(如*-*-* 12:00:00表示每天中午12点执行或daily 12:00:00、weekly Mon 03:00:00)
    Persistent如果设置为yes,如果错过启动,会在下次重启时尽快执行任务
    AccuracySec任务执行的最大误差时间,如果任务在这个时间内没有执行,systemd会尽快执行它
    Unit如果timer和service异名,则需要在这里指定,如Unit=recordTime.service

二、周期性执行服务crond

2.1 定义

  • 什么是crond服务?

    crond服务是一个守护进程,它会在后台持续运行,并定期检查是否有需要执行的任务。如果有,它会根据预定的时间规则来执行这些任务。这就像是一个内置的闹钟,到了设定的时间就会触发相应的操作。

  • 特点
    • 最小周期:crond服务会每分钟检索一遍任务列表,修改完配置文件要重载一下
    • 生效:任务会在系统空闲时执行,不一定是写几点几分就准时执行

2.2 文件及命令

  • 文件位置

    • 系统级的crontab文件通常位于/etc/crontab
    • 用户级可指定
  • crontab命令

    crontab -l(list):查看当前用户的crontab文件内容
    crontab -e(edit):编辑当前用户的crontab文件
    crontab -i:删除crontab文件内容,在删除前会提示确认
    crontab -r:删除当前用户的crontab文件
    crontab -u usr:指定用户usr的crontab文件
    
  • systemctl命令

    systemctl start|stop|restart|status cron.service
    # 重新载入配置
    systemctl daemon-reload
    

2.3 格式

  • 格式说明
    # 任务定义:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # |  |  |  |  |
    # *  *  *  *  * user-name  command-to-be-executed
    # command:命令需绝对路径,可以用whereis 命令名 来确定
    
  • 符号说明
    *:代表所有可能的值。
    ,:可以用逗号隔开的值指定一个列表范围。
    -:可以用整数之间的中杠表示一个整数范围。
    /:可以用正斜线指定时间的间隔频率。

2.4 /etc/crontab任务举例

  • 基本格式
    # 固定间隔时间:每1分钟执行一次command	
    * * * * * command
    # 每小时的第3和第15分钟执行
    3,15 * * * * command
    # 在上午8点到11点的第3和第15分钟执行
    3,15 8-11 * * * command
    # 每两天(即每隔一天)的上午8点到11点的第3和第15分钟执行
    3,15 8-11 */2 * * command
    # 每个星期一的上午8点到11点的第3和第15分钟执行
    3,15 8-11 * * 1 command
    
  • 举例
    # 每晚的21:30关机
    30 21 * * * /usr/sbin/shutdown -h now
    # 每月1、10、22日的4:45重启
    45 4 1,10,22 * * /usr/sbin/reboot
    # 每周六、周日的1:10重启
    10 1 * * 6,0 /usr/sbin/reboot
    # 每天18:00至23:00之间第0、30分各记录一次时间
    0,30 18-23 * * * /usr/bin/date > /home/date_receive.txt
    # 每星期六的晚上11 : 00 pm重启
    0 23 * * 6 /usr/sbin/reboot
    # 每两小时(隔一小时)记录一次时间
    * */2 * * * /usr/bin/date > /home/date_receive.txt
    # 晚上11点到早上7点之间,每隔一小时重启一次
    * 23-7/2 * * * /usr/sbin/reboot
    # 每月的4号与每周一到周三的11点重启一次
    0 11 4 * mon-wed /usr/sbin/reboot
    # 一月一号的4点重启一次
    0 4 1 jan * /usr/sbin/reboot
    # 每小时执行一次以下脚本
    0 1 * * * /usr/local/bin/check_server_status.sh
    
  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值