Linux系统服务

news2024/9/23 14:26:08

文章目录

  • 什么是daemon与服务(service)
    • systemd使用unit分类
  • 通过systemctl管理服务
    • 通过systemctl管理单一服务(service unit)
    • 通过systemctl查看系统上所有的服务
    • 通过systemctl管理不同的操作环境(target unit)
    • 通过systemctl分析各服务之间的依赖性
    • 与systemd的daemon运行过程相关的目录简介
    • 关闭网络服务
  • systemctl针对service类型的配置文件
    • systemctl配置文件相关目录简介
    • systemctl配置文件的设置项目简介
    • 两个vsftpd运行的实例
      • 暂时新增vsftpd到1212端口
    • 自己做个服务
  • systemctl针对timer的配置文件
  • Centos 7.X 默认启动的服务

什么是daemon与服务(service)

在Linux系统中,daemon是指一类在后台运行的服务进程,通常以d结尾。它们不与用户进行交互,也不接受用户的输入,而是在系统启动时自动启动并一直运行,为操作系统、应用程序和其他服务提供支持,一些常见的daemon包括cron(定时任务守护进程)、sshd(SSH服务守护进程)、httpd(Apache Web服务器守护进程)和mysqld(MySQL服务守护进程)等。

image-20230511112534153

systemd使用unit分类

从Centos 7.x 以后,Red Hat系列的发行版放弃沿用多年的System V 开机启动服务的流程,就是前面提到的init启动脚本的方法,改用为systemd中启动服务管理机制。那么systemd由上面好处呢?

并行处理所有服务,加速开机流程

旧的init启动脚本是按照一定顺序依次启动各个服务的,即使某些服务不依赖其他服务也要等待前面的服务启动完成。systemd就是一种可以同时启动所有服务的初始化系统,这样可以大大缩短系统启动时间。因此,使用systemd的操作系统启动速度会更快。

一经要求旧响应的on-demand启动方式

systemd是一种新型的初始化系统,它只需要一个systemd服务和systemctl命令来管理,不需要其他额外的命令来支持。而旧的System V则需要使用init、chkconfig、service等命令来管理。此外,因为systemd常驻内存,所以可以在任何时候立即启动其他服务,而不需要等待其他服务先启动完成。这使得systemd更加高效和灵活,能够更好地处理任务。

服务依赖性的自我检查

systemd可以自定义服务之间的依赖关系,如果服务B需要在服务A启动后才能启动,但是你手动启动B服务时A服务还没有启动,systemd会自动帮助你启动A服务。这样就不需要管理员手动一个一个启动服务来满足依赖关系的要求

依daemon功能分类

由于systemd管理的服务非常多,为了方便管理员管理和清理所有的服务,systemd先将所有服务定义为一个服务单位(unit),然后将这些单位归类到不同的服务类型(type)中。与旧的init只分为standalone和super daemon两种类型不同,systemd将服务单位(unit)分为了多种不同类型,例如service、socket、target、path、snapshot、timer等,方便管理员进行分类和记忆。这样就更加方便管理员进行管理和维护。

将多个daemons集合成为一个群组

就像旧的System V中有多个运行级别一样,systemd将许多功能集合成一个target项目。这个项目的主要目的是为了创建操作环境,因此集成了许多daemon,执行一个target就相当于执行多个daemon。换句话说,一个target定义了一组需要启动的服务和资源,执行一个target就会启动这些服务和资源。这样就可以方便地定义和管理不同的操作环境了。

向下兼容旧的init服务脚本

基本上,systemd可以兼容旧的System V中的启动脚本,因此旧的init启动脚本也可以通过systemd来管理,只是一些高级的systemd功能旧的init没有办法支持。不过,systemd也有一些地方无法完全替换init

比如在运行级别的对应上,只有runlevel 1、3、5有对应到systemd的某些target类型,没有全部对应上。

此外,systemd的管理程序systemctl支持的语法有限制,不像旧的/etc/init.d/daemon是纯脚本可以自定义参数,systemctl不支持自定义参数。如果某些服务是管理员手动启动的,而不是使用systemctl启动,那么systemd将无法检测到该服务,也就无法进行管理。

在systemd启动过程中,无法与管理员通过标准输入传入信息,因此自行编写systemd的启动设置时,需要取消交互机制。

systemd的配置文件放置目录

systemd是一个用于Linux操作系统的系统和服务管理器,它将之前被称为“守护进程”的执行脚本统一称为“服务单位”,并按照类型进行分类,例如系统服务、socket文件服务、存储系统状态的快照类型和操作环境。
/usr/lib/systemd/system/是Linux操作系统中的一个目录,用于存储每个服务最主要的启动脚本设置

/run/systemd/system/目录中存储的是系统执行过程中产生的服务脚本,这些脚本的优先级比/usr/lib/systemd/system/目录中的脚本要高。

/etc/systemd/system/目录用于存储管理员根据主机系统的需求建立的执行脚本。执行优先级比/run/systemd/system/高

也就是说,操作系统启动是否执行某些服务是根据/etc/systemd/system/目录下的设置来决定的。该目录下面是一大堆链接文件,实际执行的systemd启动脚本配置文件都是放在/usr/lib/systemd/system/目录中。因此,如果要修改某个服务的启动设置,应该到/usr/lib/systemd/system/目录中进行修改,而/etc/systemd/system/目录只是用于链接到正确的执行脚本配置文件。

systemd的unit类型分类说明

/usr/lib/systemd/system/ 以下的数据如何区分上述所谓不同的类型(type)呢?很简单看扩展名。举例来说,我们来看看vsftpd 启动脚本设置,还有crond与命令行模式的multi-user设置:

image-20230510202722329

所以我们知道vsftpd与crond其实算是系统服务(service),而multi-user 要算是执行环境相关的类型(target type)。根据这些扩展名的类型,大概可以找到如下几种比较常见的systemd的服务类型

扩展名主要服务功能
.service代表systemd的标准服务类型,它可以启动和管理系统进程,例如httpd.service、sshd.service等。
.socket代表systemd的socket服务类型,它可以监听指定的网络端口并转发连接请求到其他服务单元上,例如httpd.socket、sshd.socket等。
.target代表systemd的目标服务类型,它可以用于定义系统启动时要启动的服务集合,例如multi-user.target、graphical.target等。
.mount代表systemd的挂载服务类型,它可以用于管理文件系统的挂载和卸载,例如home.mount、tmp.mount等。
.automount代表systemd的自动挂载服务类型,它可以在需要时自动挂载文件系统,例如media-photos.automount。
.path检测特定文件或目录类型(path unit):某些服务需要检测某些特定的目录来·1提供队列服务,例如最常见的打印服务,就是通过检测打印队列目录来启动打印功能,这时候就得要.path服务类型支持
.timer代表systemd的定时器服务类型,它可以在指定的时间间隔内定期运行一个服务,例如logrotate.timer。

其中.service的系统服务类型最常见,因为我们一堆网络服务都是使用这种类型来设计的。

通过systemctl管理服务

通过systemctl管理单一服务(service unit)

一般来说服务的启动有两个阶段,一个是【开机的时候设置要不要启动这个服务】,以及【你现在要不要启动这个服务】,这两者之间有很大的差异。举个例子,假如我们现在要【立刻停止atd这个服务】时,正确的的方法(不能使用kill)要怎么处理?

[root@chenshiren ~]# systemctl  [command] [unit]
选项command主要有:
start:立刻启动后面接的unit
stop:里关闭后面接的unit
restart:立刻重启后面接的unit,就是执行stop再start的意思
reload:不关闭后面接的unit的情况下,重新加载配置文件,让设置生效
enable:设置下次开机时,后面接的unit会被启动
disable:设置下次开机时,后面接的unit不会被启动
status:目前后面接的这个unit的状态,会里出有没有正在执行、开机默认执行与否、登录等信息等
is-aotive:目前有没有正在运行
is-enable:开机时有没有默认启用这个unit

# 示例1 看看目前atd这个服务的状态是什么(前提是你得有at这个服务)
[root@chenshiren ~]# systemctl status atd
● atd.service - Deferred execution scheduler
     Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; preset: enabled)
     Active: active (running) since Mon 2024-03-25 11:56:44 CST; 8min ago
       Docs: man:atd(8)
   Main PID: 1295 (atd)
      Tasks: 1 (limit: 50264)
     Memory: 308.0K
        CPU: 3ms
     CGroup: /system.slice/atd.service
             └─1295 /usr/sbin/atd -f
325 11:56:44 chenshiren systemd[1]: Started Deferred execution scheduler.
# 重点在于第二、第三行
# Loaded:这行说明、开机的时候这个unit会不会启动,enabled为开机启动,disabled开机不会启动
# Active:现在这个unit的状态是正在执行(running)或没有执行(dead)
# 后面几行则是说明这个unit程序的PID状态以及最后一行显示这个服务的日志文件信息
# 日志文件信息格式为:【时间】 【信息发送主机】【哪一个服务的信息】【实际信息内容】

# 示例2 正常关闭这个atd服务
[root@chenshiren ~]# systemctl stop atd
[root@chenshiren ~]# systemctl status atd
○ atd.service - Deferred execution scheduler
     Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; preset: enabled)
     Active: inactive (dead) since Mon 2024-03-25 12:08:51 CST; 5s ago
   Duration: 12min 6.938s
       Docs: man:atd(8)
    Process: 1295 ExecStart=/usr/sbin/atd -f $OPTS (code=exited, status=0/SUCCESS)
   Main PID: 1295 (code=exited, status=0/SUCCESS)
        CPU: 3ms

325 11:56:44 chenshiren systemd[1]: Started Deferred execution scheduler.
325 12:08:51 chenshiren systemd[1]: Stopping Deferred execution scheduler...
325 12:08:51 chenshiren systemd[1]: atd.service: Deactivated successfully.
325 12:08:51 chenshiren systemd[1]: Stopped Deferred execution scheduler.
# 目前这个unit下次开机还是会启动,但是现在处于关闭状态
# 同时,最后两行为新增加的登录信息,告诉我们目前系统状态
# 上面案例中,我们已经关闭了ard,这样做才是对的
# 不应该使用kill的方式来关闭一个正常的服务,否则systemctl会无法继续监控该服务

Active除了running和dead之外还有其他状态

  • **active(running):**正有一个或多个进程正在系统中运行的意思,举例来说,正在运行中的atd就是这种模式
  • **active(exited):**仅执行一次就正常结束的服务,目前并没有任何进程再系统中执行。
  • **active(waiting):**正在运行当中,不过还需要等待其他的事件发生才能继续运行。
  • **inactive:**这个服务目前没有运行
  • **enabled:**这个daemon将在开机时被运行
  • **disabled:**这个daemon在开机时不会被运行
  • **static:**这个daemon不可以自己启动(不可enable),不过可能会被其他的enabled的服务来唤醒(依赖属性的服务)
  • **mask:**这个daemon无论如何都无法被启动,因为已经被强制注销(非删除)。可通过systemctl unmask方式改为默认状态。

服务启动/关闭/查看的练习

找到系统中名为chronyd的服务,查看此服务的状态,查看完毕后,将此服务设置为:(1)开机不会启动(2)现在状况是关闭的

# 1.查看状态,确认是否为关闭/未启动
[root@localhost ~]# systemctl status chronyd.service
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
   Active: active (running) since 四 2023-05-11 08:46:23 CST; 8h ago
     Docs: man:chronyd(8)
           man:chrony.conf(5)
 Main PID: 804 (chronyd)
   CGroup: /system.slice/chronyd.service
           └─804 /usr/sbin/chronyd

511 08:46:23 localhost.localdomain systemd[1]: Starting NTP client/server...
511 08:46:23 localhost.localdomain chronyd[804]: chronyd version 3.4 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SC...EBUG)
511 08:46:23 localhost.localdomain chronyd[804]: Frequency -33.147 +/- 0.259 ppm read from /var/lib/chrony/drift
511 08:46:23 localhost.localdomain systemd[1]: Started NTP client/server.
511 08:46:33 localhost.localdomain chronyd[804]: Selected source 162.159.200.1
511 08:46:33 localhost.localdomain chronyd[804]: System clock wrong by -3.831645 seconds, adjustment started
511 08:46:29 localhost.localdomain chronyd[804]: System clock was stepped by -3.831645 seconds
511 08:46:33 localhost.localdomain chronyd[804]: Source 193.182.111.14 replaced with 193.182.111.142
511 09:08:10 localhost.localdomain chronyd[804]: Selected source 84.16.67.12
Hint: Some lines were ellipsized, use -l to show in full.

# 2.由上面知道目前是启动的,因此立刻将他关闭,同时开机不会启动才行
[root@localhost ~]# systemctl stop chronyd.service
[root@localhost ~]# systemctl disable chronyd.service
Removed symlink /etc/systemd/system/multi-user.target.wants/chronyd.service.
# 其实就是从/etc/systemd/system 下面移除了一条链接文件而已
[root@localhost ~]# systemctl status chronyd.service
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled)
   Active: inactive (dead)
     Docs: man:chronyd(8)
           man:chrony.conf(5)
# 如此则将chronyd这个服务完整的关闭了

关于systemctl命令启动/停止服务后面的后缀名是否加

在使用systemctl命令停止服务时,systemctl stop atd.service和systemctl stop atd这两条命令是等价的,都会停止atd服务。因为systemctl命令会自动识别服务类型,如果服务名能够唯一匹配到一个服务单元,就可以省略服务单元名的后缀。
不过,建议在使用systemctl命令时,尽量使用完整的服务单元名来指定服务,这样可以避免服务名和其他单元名发生冲突或者产生歧义。同时,完整的服务单元名也更加明确和易于理解,便于其他管理员或者开发人员进行服务管理和维护。
因此,建议使用下面的命令来停止atd服务:

systemctl stop atd.service

这样可以确保服务单元名的唯一性和明确性,避免发生不必要的错误或者冲突。

通过systemctl查看系统上所有的服务

[root@chenshiren ~]# systemctl [command] [--type=TYPE] [--all]
command:
   list-units      :依据unit显示目前有启动的unit,若加上-all才会列出没启动的。
   list-units-files:依据/usr/lib/systemd/system/ 内的文件,将所有文件列表说明。
--type=TYPE:就是之前提到的unit类型,主要有service、socket、target等
# 示例1 列出系统上面有启动的unit
[root@localhost ~]# systemctl list-units
UNIT                       LOAD   ACTIVE SUB      DESCRIPTION
....
vsftpd.service            loaded active running   Vsftpd ftp daemon
sshd.service              loaded active running   OpenSSH server daemon
...
# 列出的项目中,主要的意义是:
# UNIT   :项目的名称,包括各unit的类别(看副文件名)
# LOAD   :开机时是否会被加载,默认systemctl显示的是加载的项目而已
# ACTIVE :目前的状态,须与后续的SUB搭配,就是我们用systemctl status 查看时,active的项目
# DESCRIPTION:详细描述
# 另外systemctl 不加删除,默认就是 list-units的意思

# 示例2 列出所有已经安装的unit有哪些
[root@chenshiren ~]# systemctl list-unit-files
....
UNIT FILE                                  STATE           PRESET  
atd.service                                enabled         enabled
firewalld.service                          enabled         enabled 
sshd.service                               enabled         enabled
vsftpd.service                             enabled         disabled
....

# 示例3 假设我不想要知道这么多的unit项目,我只想知道service这种类别的daemon而已
#      而且不论是否已经成功,通通要显示出来
[root@chenshiren ~]# systemctl list-units --type=service --all
  UNIT                      LOAD      ACTIVE     SUB     JOB   DESCRIPTION  
  ....
  atd.service              loaded    inactive   dead          Deferred execution scheduler
  ntpd.service             not-found inactive   dead          ntpd.service
  ....
# 只有*.service的项目才会出现

通过systemctl管理不同的操作环境(target unit)

# 示例1 列出跟操作界面有关的target项目
[root@localhost ~]# systemctl list-units --type=target --all
  UNIT                      LOAD      ACTIVE   SUB    DESCRIPTION
  basic.target              loaded    active   active Basic System
  bluetooth.target          loaded    active   active Bluetooth
  cryptsetup.target         loaded    active   active Local Encrypted Volumes
  emergency.target          loaded    inactive dead   Emergency Mode
  final.target              loaded    inactive dead   Final Step
  getty-pre.target          loaded    inactive dead   Login Prompts (Pre)
  getty.target              loaded    active   active Login Prompts
  graphical.target          loaded    inactive dead   Graphical Interface
  initrd-fs.target          loaded    inactive dead   Initrd File Systems
  initrd-root-fs.target     loaded    inactive dead   Initrd Root File System
...
...
  • graphical.target:就是命令加上图形界面,这个项目已经包含了下面的multi-user.target
  • multi-user.target:纯命令行模式
  • rescue.target:在无法使用root登录的情况下,systemd在启动时会多加一个额外的临时系统,与你原本的系统无关,这时你可以取得root的权限来维护你的系统。但是这是额外系统,因此可能需要用到chroot的方式来取得你原有的系统
  • emergency.target:紧急处理系统的错误,还是需要使用root登录的情况,在无法使用rescue.target时,可以尝试使用这种模式。
  • shutdown.target:就是关机的模式
  • getty.target:可以设置你需要几个tty之类的操作,如果你想要降低tty的数量,可以修改它的配置文件
[root@chenshiren ~]# systemctl [command] [unit.target]
选项command:
     get-default:取得目前的target
     set-default:设置后面接的target称为默认的操作模式
     isolate:切换到后面接的模式  
# 示例1 我们测试机器默认是图形界面、先查看是否为图形模式,再将模式模式转为命令行模式或图形界面
[root@chenshiren ~]# systemctl get-default
graphical.target
[root@chenshiren ~]# systemctl set-default multi-user.target
Removed "/etc/systemd/system/default.target".
Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/multi-user.target.
[root@chenshiren ~]# systemctl get-default 
multi-user.target

# 示例2 在不重新启动的情况下,将目前的操作环境改为纯命令行模式,关闭图形界面
[root@localhost ~]# systemctl isolate multi-user.target

# 若需要重新取得图形界面
[root@localhost ~]# systemctl isolate graphical.target

# 需要注意的是,改变graphical.target 以及 multi-user.target 是通过isolate来完成的

systemd 也提供了数个简单的命令给我们切换操作模式

systemctl poweroff     系统关机
systemctl reboot       重新开机
systemctl suspend      进入挂起模式
systemctl hibernate    进入休眠模式
systemctl rescue       强制进入恢复模式
systemctl emergency    强制进入紧急恢复模式

我们来一一解释一下上面的操作

  1. systemctl poweroff:该命令用于关闭系统,类似于传统的shutdown -h now命令。
  2. systemctl reboot:该命令用于重新启动系统,类似于传统的shutdown -r now命令。
  3. systemctl suspend:该命令用于将系统挂起(睡眠模式),可以快速恢复系统状态,但是会消耗一定的电量。
  4. systemctl hibernate:该命令用于将系统休眠(休眠模式),可以保存当前系统状态到硬盘中,以便下次唤醒时恢复。
  5. systemctl rescue:该命令用于强制进入恢复模式,该模式下只会启动最小限度的系统服务,可以用于修复系统问题,如丢失了root密码等。
  6. systemctl emergency:该命令用于强制进入紧急恢复模式,该模式下只会启动最小限度的系统服务,并且所有本地文件系统都会以只读方式挂载,可以用于修复严重的系统问题,如磁盘损坏等。

通过systemctl分析各服务之间的依赖性

如何追踪某一个unit的依赖性呢?举例来说,我们怎么知道graphical.target 会用到 multi-user.target?那graphical.target 下面还有哪些东西?

[root@chenshiren ~]# systemctl list-dependencies [unit] [--reverse]
选项:
--reverse:反向追踪谁使用这个unit的意思。

列出目前的target环境下,用到了哪些unit

[root@localhost ~]# systemctl get-default
graphical.target
[root@localhost ~]# systemctl list-dependencies
default.target
● ├─display-manager.service
● ├─network.service
● ├─systemd-readahead-collect.service
● ├─systemd-readahead-replay.service
● ├─systemd-update-utmp-runlevel.service
● └─multi-user.target
●   ├─atd.service
●   ├─auditd.service
●   ├─crond.service
●   ├─dbus.service
●   ├─irqbalance.service
●   ├─kdump.service
●   ├─network.service
●   ├─NetworkManager.service
●   ├─plymouth-quit-wait.service
●   ├─plymouth-quit.service
●   ├─postfix.service
●   ├─rhel-configure.service
●   ├─rsyslog.service
●   ├─sshd.service
●   ├─systemd-ask-password-wall.path
●   ├─systemd-logind.service
●   ├─systemd-update-utmp-runlevel.service
●   ├─systemd-user-sessions.service
●   ├─tuned.service
●   ├─vmtoolsd.service
●   ├─vsftpd.service
●   ├─basic.target
●   │ ├─microcode.service
●   │ ├─rhel-dmesg.service
●   │ ├─selinux-policy-migrate-local-changes@targeted.service
●   │ ├─paths.target
●   │ ├─slices.target
●   │ │ ├─-.slice
●   │ │ └─system.slice
●   │ ├─sockets.target
●   │ │ ├─dbus.socket
●   │ │ ├─dm-event.socket
●   │ │ ├─systemd-initctl.socket
●   │ │ ├─systemd-journald.socket
●   │ │ ├─systemd-shutdownd.socket
●   │ │ ├─systemd-udevd-control.socket
●   │ │ └─systemd-udevd-kernel.socket
●   │ ├─sysinit.target
●   │ │ ├─dev-hugepages.mount
●   │ │ ├─dev-mqueue.mount
●   │ │ ├─kmod-static-nodes.service
●   │ │ ├─lvm2-lvmetad.socket
●   │ │ ├─lvm2-lvmpolld.socket
●   │ │ ├─lvm2-monitor.service
●   │ │ ├─plymouth-read-write.service
●   │ │ ├─plymouth-start.service
●   │ │ ├─proc-sys-fs-binfmt_misc.automount
●   │ │ ├─rhel-autorelabel-mark.service
●   │ │ ├─rhel-autorelabel.service
●   │ │ ├─rhel-domainname.service
●   │ │ ├─rhel-import-state.service
●   │ │ ├─rhel-loadmodules.service
●   │ │ ├─sys-fs-fuse-connections.mount
●   │ │ ├─sys-kernel-config.mount
●   │ │ ├─sys-kernel-debug.mount
●   │ │ ├─systemd-ask-password-console.path
●   │ │ ├─systemd-binfmt.service
●   │ │ ├─systemd-firstboot.service
●   │ │ ├─systemd-hwdb-update.service
●   │ │ ├─systemd-journal-catalog-update.service
●   │ │ ├─systemd-journal-flush.service
●   │ │ ├─systemd-journald.service
●   │ │ ├─systemd-machine-id-commit.service
●   │ │ ├─systemd-modules-load.service
●   │ │ ├─systemd-random-seed.service
●   │ │ ├─systemd-sysctl.service
●   │ │ ├─systemd-tmpfiles-setup-dev.service
●   │ │ ├─systemd-tmpfiles-setup.service
●   │ │ ├─systemd-udev-trigger.service
●   │ │ ├─systemd-udevd.service
●   │ │ ├─systemd-update-done.service
●   │ │ ├─systemd-update-utmp.service
●   │ │ ├─systemd-vconsole-setup.service
●   │ │ ├─cryptsetup.target
●   │ │ ├─local-fs.target
●   │ │ │ ├─-.mount
●   │ │ │ ├─boot.mount
●   │ │ │ ├─home.mount
●   │ │ │ ├─rhel-readonly.service
●   │ │ │ └─systemd-remount-fs.service
●   │ │ └─swap.target
●   │ │   └─dev-mapper-centos\x2dswap.swap
●   │ └─timers.target
●   │   └─systemd-tmpfiles-clean.timer
●   ├─getty.target
●   │ └─getty@tty1.service
●   └─remote-fs.target

因为我们把操作模式变成了 multi-user.target ,因此这边使用list-dependencies时,所列出的default.target其实是multi-user.target的内容。根据线条连接结构,我们也能够知道,multi-user.target 其实还会用到 basic.target、getty.target、remote-fs.target 三大项目,而basic.target 又用到了 sockets.target、sysint.target、timers.target等,依赖关系显示的很清楚。

如果查出谁会用到multi-user.target?

[root@chenshiren ~]# systemctl list-dependencies --reverse
default.target
● └─graphical.target

reverse,本来就是反向的意思,所以加上这个选项,代表【谁还会用到我的服务】的意思,所以 multi-user.target主要是被default.target所使用

那么default-target又使用了多少服务呢?

[root@localhost ~]# systemctl list-dependencies default.target
default.target
● ├─display-manager.service
● ├─network.service
● ├─systemd-readahead-collect.service
● ├─systemd-readahead-replay.service
● ├─systemd-update-utmp-runlevel.service
● └─multi-user.target
●   ├─atd.service
●   ├─auditd.service
●   ├─crond.service
●   ├─dbus.service
●   ├─irqbalance.service
●   ├─kdump.service
●   ├─network.service
●   ├─NetworkManager.service
●   ├─plymouth-quit-wait.service
●   ├─plymouth-quit.service
●   ├─postfix.service
●   ├─rhel-configure.service
...
...

与systemd的daemon运行过程相关的目录简介

  1. /usr/lib/systemd/system/:使用CentOS官方提供的软件安装后,默认的启动脚本配置文件都放在这里,这里的数据尽量不要修改,要修改时,请到/etc/systemd/system下面修改较好。

  2. /run/systemd/system/:系统执行过程中所产生的服务脚本,这些脚本的优先级要比/usr/lib/systemd/system 高

  3. /etc/systemd/system/:管理员依据主机系统的需求所建立的执行脚本,其实这里目录有点像以前的/etc/rc.d/rc5.d/Sxx 之类的功能,执行优先级又比/run/systemd/system/ 高

  4. /etc/sysconfig/*:该目录存放系统服务的配置文件。这些配置文件包含了服务启动时的参数和环境变量等信息。例如,/etc/sysconfig/iptables文件包含了iptables防火墙的配置信息。如果服务单元文件中指定了某个配置文件路径,则该路径的配置文件会覆盖该目录中的同名配置文件。

  5. /var/lib/:该目录存放系统和服务的运行时数据,如数据库、缓存、日志等。例如,/var/lib/mysql目录存放了MySQL数据库的数据文件。在服务启动时,服务进程会使用该目录中存储的数据。

  6. /run/:该目录存放运行时文件,如进程ID文件、锁文件等。例如,/run/httpd/httpd.pid文件存放了Apache HTTP服务器进程的PID。这些文件通常在系统启动时自动创建,系统关闭时自动删除。如果该目录中的文件不可用或损坏,服务可能无法正常启动。

我们知道systemd里面有很多的本机会用到socket服务,里面可能会产生很多的socket文件,那你怎么知道socket文件放置在哪?

[root@chenshiren ~]# systemctl list-sockets
LISTEN                         UNIT                            ACTIVATES               
/run/.heim_org.h5l.kcm-socket  sssd-kcm.socket                 sssd-kcm.service
/run/avahi-daemon/socket       avahi-daemon.socket             avahi-daemon.service
/run/cups/cups.sock            cups.socket                     cups.service
/run/dbus/system_bus_socket    dbus.socket                     dbus-broker.service
/run/dmeventd-client           dm-event.socket                 dm-event.service
/run/dmeventd-server           dm-event.socket                 dm-event.service
/run/initctl                   systemd-initctl.socket          systemd-initctl.service
/run/lvm/lvmpolld.socket       lvm2-lvmpolld.socket            lvm2-lvmpolld.service
/run/systemd/coredump          systemd-coredump.socket         -                       
/run/systemd/journal/dev-log   systemd-journald-dev-log.socket systemd-journald.service
/run/systemd/journal/socket    systemd-journald.socket         systemd-journald.service
/run/systemd/journal/stdout    systemd-journald.socket         systemd-journald.service
/run/udev/control              systemd-udevd-control.socket    systemd-udevd.service
@ISCSIADM_ABSTRACT_NAMESPACE   iscsid.socket                   iscsid.service
@ISCSID_UIP_ABSTRACT_NAMESPACE iscsiuio.socket                 iscsiuio.service
kobject-uevent 1               systemd-udevd-kernel.socket     systemd-udevd.service

16 sockets listed.
Pass --all to see loaded but inactive sockets, too.
# 这样很清楚就能够知道正在监听本地服务需求的socket文件所在的位置

网络服务与端口对应简介

网络服务与端口是一一对应的,每个网络服务都需要使用一个端口来进行通信。以下是常见网络服务及其对应的端口:

  • FTP(文件传输协议):20(数据端口)、21(控制端口)

  • SSH(安全外壳协议):22

  • Telnet(远程终端协议):23

  • SMTP(简单邮件传输协议):25

  • DNS(域名系统):53

  • HTTP(超文本传输协议):80

  • POP3(邮局协议版本3):110

  • HTTPS(安全超文本传输协议):443

  • RDP(远程桌面协议):3389

当网络服务需要进行通信时,它会使用相应的端口进行数据的传输和接收。这样的设计可以让不同的网络服务在同一台计算机上并存,同时也可以让不同的计算机上的网络服务进行通信。

也可以查询/etc/service来查询服务的端口

less  /etc/service
# 文件内容较多建议使用less

image-20230512151346445

这个文件的内容是以下面的格式来显示的

< dademon name > < port/封包协议 > < 该服务的说明 >

关闭网络服务

什么是网络服务,基本上产生一个网络监听端口(port)的进程,他就可以称为网络服务,那么如何查看网络端口?

# 默认没有netstat命令需要手动安装net-tools
[root@chenshiren ~]# netstat -tlunp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address         Foreign Address  State    PID/Program name    
tcp        0      0 127.0.0.1:25          0.0.0.0:*       LISTEN     1260/master         
tcp        0      0 127.0.0.1:631         0.0.0.0:*       LISTEN     1124/cupsd          
tcp        0      0 0.0.0.0:22            0.0.0.0:*       LISTEN     1128/sshd: /usr/sbi 
tcp6       0      0 ::1:631               :::*            LISTEN     1124/cupsd          
tcp6       0      0 ::1:25                :::*            LISTEN     1260/master         
tcp6       0      0 :::21                 :::*            LISTEN     1283/vsftpd         
tcp6       0      0 :::22                 :::*          LISTEN       1128/sshd: /usr/sbi 
udp        0      0 127.0.0.1:323         0.0.0.0:*                  982/chronyd         
udp        0      0 0.0.0.0:5353          0.0.0.0:*                  937/avahi-daemon: r 
udp        0      0 0.0.0.0:51064         0.0.0.0:*                  937/avahi-daemon: r 
udp6       0      0 ::1:323               :::*                       982/chronyd         
udp6       0      0 :::5353               :::*                       937/avahi-daemon: r 
udp6       0      0 :::38977              :::*                       937/avahi-daemon: r 

那么如果我要关闭vsftpd服务

[root@localhost ~]# systemctl stop vsftpd.service
[root@chenshiren ~]# netstat -tlunp |grep vsftpd.service

systemctl针对service类型的配置文件

systemctl配置文件相关目录简介

现在我们知道服务的管理是通过systemd来完成,而systemd的配置文件大部分放置于/usr/lib/systemd/system/ 目录中,但是Red Hat官方文件指出,该目录的文件主要是原本软件所提供的设置,建议不要修改。而要修改的位置应该放置于/etc/systemd/system目录中。举例来说你想要额外修改vsftpd.service的话,官方建议你放在哪些地方呢?

  • /usr/lib/systemd/system/vsftpd.service:官方发布的默认配置文件

  • /etc/systemd/system/vsftpd.serivce.d/custom.conf:在/etc/systemd/system 下面建立于配置文件相同的目录,但是要加上.d的扩展名,然后在该目录下建立配置文件即可。另外,配置文件的扩展名最好使用.conf。在这目录下的文件会【累加其他设置】到 /usr/lib/systemd/system/vsftpd.service中。

  • /etc/systemd/system/vsftpd.service.wants/*:此目录内的文件为链接文件,设置依赖服务的链接,意思是启动vsftpd.service之后,最好再加上该目录下面建议的服务。

  • /etc/systemd/system/vsftpd.service.requires/*:此目录内的文件为链接文件,设置依赖服务的链接。意思就是在启动vsftpd.service 之前,需要事先启动哪些服务的意思。

基本上,在配置文件里你都可以自由设置依赖服务的检查,并且设置加入到哪些target里面。但是如果是已经存在的配置文件,或是官方提供的配置文件,Red Hat建议你不要修改原设置,而是到上面提到的几个目录去进行额外的自定义设置比较好,如果你硬要修改原始的/usr/lib/systemd/system 下面的配置文件,那也是没问题的。

systemctl配置文件的设置项目简介

了解完目录在了解一下文件本身的内容,让我们来看看sshd.service的内容。

[root@localhost ~]# cat /usr/lib/systemd/system/sshd.service 
[Unit]      # 这个项目与此unit的解释、执行服务依赖性有关。
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]   # 这个项目与实际执行的命令参数有关
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]   # 这个项目说明此unit要挂载哪个到target下面。
WantedBy=multi-user.target

[Service]、[Socket]、[Timer]、[Mount]、[Path]:不同的unit类型就得要使用相对应的设置项目。我们使用sshd.service来当模板,所以这边就使用[service]来设置。

分析上面的配置文件,大概可以将整个设置分为3个部分

  1. [Unit] 部分包含了服务的元数据,Description 字段说明了服务的描述信息,即 OpenSSH 服务器守护进程。Documentation 字段指定了服务的文档信息,即 sshd 服务的 man 页面。After 字段指定了服务需要在 network.targetsshd-keygen.service 启动之后启动,Wants 字段指定了服务需要依赖于 sshd-keygen.service 服务。
  2. [Service] 部分定义了服务的具体行为,Type 字段指定了服务的类型为 notify,表示当服务准备就绪时会发送一个通知给 systemd。EnvironmentFile 字段指定了服务需要读取的环境变量文件,ExecStart 字段指定了服务的启动命令和选项,ExecReload 字段指定了服务的重载命令。KillMode 字段指定了服务的停止策略,Restart 字段指定了服务的重启策略为在失败时重启,RestartSec 字段指定了服务重启的时间间隔为 42 秒。
  3. [Install] 部分定义了服务的安装方式,WantedBy 字段指定了服务需要在 multi-user.target 启动之后启动。

此外每个部分里面还有很多的设置,如下所示

unit部分

设置参数参数意义说明
Description是当我们使用【systemctl list-units】时,会输出给管理员看的建议说明信息。
Documentation这个项目在提供给管理员能够进行进一步的文件查询的功能。提供的文件可以是如下内容:
Documentation=http://www…
Documentation=man:sshd(8)
Documentation=file:/etc/ssh/sshd_config
After说明此unit是在哪个daemon启动之后才启动的意思。基本上仅是说明服务启动顺序而已,并没有强制要求里面的服务一定启动后,此unit才能启动。
Before与After的意义相反,是在什么服务启动前最好启动这个服务的意思。仅是规范服务启动顺序,并非强制要求的意思
Requires明确的定义unit需要在哪个daemon启动后才能够启动,就是设置依赖服务。如果在此项设置的前导服务没有启动,那么此unit就不会被启动
Wants与Requires刚好相反,规范的是这个unit之后最好还要启动什么服务比较好的意思。如果Wants后面接的服务没有启动,其实不会影响到这个unit本身
Conflicts代表冲突的服务。就是这个项目后面接的服务如果有启动,那么我们这个unit本身就不能启动。如果我们unit有启动,则此项目后面的服务就不能启动。就是冲突性的检查

Service部分

设置参数参数意义说明
Type该字段指定了服务的类型,一般来说有如下几种类型:
1. simple:最常用的类型,用于启动一个进程,systemd会等待这个进程运行完毕后再启动下一个服务。
2. forking:用于启动一个进程,但是systemd会等待这个进程fork出一个子进程,然后父进程退出,而子进程则继续运行。常用于一些需要后台运行的服务,比如nginx。
3. oneshot:用于只需要执行一次的服务,systemd会等待这个服务执行完毕后就退出。
4. dbus:用于启动一个dbus服务。
5. notify:用于启动一个进程,但是这个进程会在运行完毕后向systemd发送一个通知,告诉它服务已经启动完毕了。
6. idle:用于启动一个进程,但是会等待一段时间,直到系统处于空闲状态时再启动服务。
EnvironmentFile指定启动脚本需要读取的环境配置文件。
ExecStart字段指定了服务的启动命令和选项
ExecStop与systemctl stop 的执行有关,关闭此服务时所运行的命令
ExecReload与systemctl reload 有关的命令操作
Restart指定服务的重启策略
RemainAfterExit当设置RemainAfterExit=1时,则当这个daemon所属的所有进程都终止之后,此服务会再尝试启动,如果设置为0,则服务再退出后视为不再启动。
TimeoutSec若这个服务在启动或关闭时,因为某些缘故导致无法顺利【正常启动或正常结束】的情况下,则我们要等多久才进入【强制结束】的状态。
KillMode字段指定了服务的停止策略
RestartSec字段指定了服务重启的时间

Install部分

设置参数参数意义说明
WantedBy指定服务需要在哪个target启动之后启动,而且这个服务必须是启动的
Also指定与此服务一起启动的服务。
Alias运行一个链接的别名的意思

接下来根据上面这些数据来进行一些简易的操作

两个vsftpd运行的实例

因为某些原因,你可能会使用到两个端口,分别是正常的21以及特殊的555.这两个port都启用的情况下,你可能使用到两个配置文件以及两个启动脚本设置。假设是这样:

  • 默认的21端口:使用/etc/vsftpd/vsftpd.conf 配置文件,以及/usr/lib/systemd/system/ vsftpd.service设置脚本
  • 特殊的2121端口:使用/etc/vsftpd/vsftpd2.conf 配置文件,以及 /etc/systemd/system/ vsftpd2.service 设置脚本。

我们可以这样做

  1. 先建立好需要的配置文件
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# cp vsftpd.conf vsftpd2.conf
[root@localhost vsftpd]# vim vsftpd.conf 
#listen_port=2121
[root@localhost vsftpd]# vim vsftpd2.conf 
listen_port=2121
[root@localhost vsftpd]# diff vsftpd.conf vsftpd2.conf 
129c129
< #listen_port=2121
---
> listen_port=2121
# 注意这两个配置文件的差别,只有这一行不同而已
  1. 开始处理启动脚本设置
[root@localhost vsftpd]# cd  /etc/systemd/system/
[root@localhost system]# cp /usr/lib/systemd/system/vsftpd.service vsftpd2.service
[root@localhost system]# vim vsftpd2.service 
[Unit]
Description=Vsftpd ftp daemon
After=network.target

[Service]
Type=forking
ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd2.conf

[Install]
WantedBy=multi-user.target
  1. 重新加载systemd的脚本配置文件内容
[root@localhost system]# systemctl daemon-reload
[root@localhost system]# systemctl list-unit-files --all |grep vsftpd
vsftpd.service                                enabled 
vsftpd2.service                               disabled
vsftpd@.service                               disabled
vsftpd.target                                 disabled
[root@localhost system]# systemctl status vsftpd2.service
● vsftpd2.service - Vsftpd ftp daemon
   Loaded: loaded (/etc/systemd/system/vsftpd2.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
[root@localhost system]# systemctl restart vsftpd.service vsftpd2.service
[root@localhost system]# systemctl enable vsftpd.service vsftpd2.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd2.service to /etc/systemd/system/vsftpd2.service.

image-20230514203647117

image-20230514203710210

很简单地将你的systemd所管理的vsftpd做了另一个相同的服务。如果你有需求按照上面的方法做就行了。

暂时新增vsftpd到1212端口

不知道你有没有发现,其实再/usr/lib/systemd/system/ 下面还有个特别的 vsftpd@.service 。来看看它的内容

[root@localhost ~]# cat /usr/lib/systemd/system/vsftpd@.service
[Unit]
Description=Vsftpd ftp daemon
After=network.target
PartOf=vsftpd.target

[Service]
Type=forking
ExecStart=/usr/sbin/vsftpd /etc/vsftpd/%i.conf

[Install]
WantedBy=vsftpd.target

%i或%I 就是代表@后面接的范例文件名的意思

[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# cp vsftpd.conf vsftpd3.conf
[root@localhost vsftpd]# vim vsftpd3.conf
listen_port=1212

image-20230514213022531

image-20230514213143535

因为我们启用了vsftpd@vsftpd3.service,代表要实验的配置文件在 /etc/vsftpd/vsftpd3.conf 的意思,所以可以直接通过vsftpd@.service 而无须重新设置启动脚本。这样设置会比前面一个小节中的方法要简单,不过你要注意到 @ 这个东西。

自己做个服务

我们自己做个服务。假设我要制作一个可以备份自己系统的服务,这个脚本放在/backups下面,内容如下

[root@localhost ~]# vim /backups/backup.sh
#!/bin/bash
source="/home /root /var/lib /var/spool/{cron,at,mail}"
target="/backups/backup-system-$(date +%Y-%m-%d).tar.gz"
[ ! -d /backups ] && mkdir /backups
tar -zcvf ${target} ${source} &> /backups/backup.log

脚本解释:

这是一个bash脚本,用于备份系统的重要文件和目录。下面是每个部分的解释:

  1. source=“/home /root /var/lib /var/spool/{cron,at,mail}”:这个变量定义了需要备份的目录,包括/home、/root、/var/lib、/var/spool/cron、/var/spool/at和/var/spool/mail。
  2. target=“/backups/backup-system-$(date +%Y-%m-%d).tar.gz”:这个变量定义了备份文件的路径和名称,其中$(date +%Y-%m-%d)表示当前日期,tar.gz表示压缩格式。
  3. [ ! -d /backups ] && mkdir /backups:如果/backups目录不存在,则创建这个目录。
  4. tar -zcvf ${target} ${source} &> /backups/backup.log:使用tar命令将source变量定义的目录打包成一个压缩文件,保存到target变量定义的位置。-z表示使用gzip进行压缩,-c表示创建新的存档文件,-v表示显示打包的详细过程,-f表示指定存档文件的名称。使用&>将tar命令的输出和错误信息都重定向到/backups/backup.log文件中,以便记录备份过程中出现的任何问题。
[root@localhost ~]# chmod a+x /backups/backup.sh 
[root@localhost ~]# ll /backups/backup.sh 
-rwxr-xr-x. 1 root root 215 514 23:29 /backups/backup.sh
# 记得要赋予它可执行权限才行

那么接下来如何设计一个名为backup.service的启动脚本设置?可以如下这样做

[root@localhost ~]# vim /etc/systemd/system/backup.service
[Unit]
Description=backup my server
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c "echo /backups/backup.sh | at now"
[Install]
WanteBy=multi-user.target
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start backup.service
[root@localhost ~]# systemctl status backup.service
● backup.service - backup my server
   Loaded: loaded (/etc/systemd/system/backup.service; static; vendor preset: disabled)
   Active: inactive (dead)

514 23:11:38 localhost.localdomain systemd[1]: [/etc/systemd/system/backup.service:8] Unknown lvalu...ll'
5月 14 23:11:38 localhost.localdomain systemd[1]: Started backup my server.
5月 14 23:11:38 localhost.localdomain bash[3022]: job 1 at Sun May 14 23:11:00 2023
5月 14 23:11:45 localhost.localdomain systemd[1]: [/etc/systemd/system/backup.service:8] Unknown lvalu...ll'
Hint: Some lines were ellipsized, use -l to show in full.
# 为什么Active是inactive?这是因为我们的服务仅是一个简单的脚本
# 因此执行完毕就完毕了,不会继续常驻在内存中。
[root@localhost backups]# cd /backups/
[root@localhost backups]# ls
backup.log  backup.sh  backup-system-2023-05-14.tar.gz

配置文件解释:

  1. [Unit]:这个部分是设置服务的描述信息和依赖关系,Description是服务的描述信息,Requires=atd.service 表示这个服务依赖于 atd.service 服务,也就是说,只有在 atd.service 运行的情况下,这个服务才能运行。
  2. [Service]:这个部分是设置服务的运行参数,Type=simple 表示这个服务是最常用的类型,即启动一个进程,systemd会等待这个进程运行完毕后再启动下一个服务。ExecStart=/bin/bash -c “echo /backups/backup.sh | at now” 表示启动这个服务时,会执行这个命令,即在当前时间调用 at 命令,将备份脚本 /backups/backup.sh 添加到任务队列中,并在任务队列中立即执行。
  3. [Install]:这个部分是设置服务的安装信息,WantedBy=multi-user.target 表示将这个服务添加到 multi-user.target 的依赖关系中,也就是说,系统启动时会自动启动这个服务。

完成上述的操作之后,以后你都可以直接实验【systemctl start backup.service 】进行系统的备份了。非常方便!

systemctl针对timer的配置文件

有时候,你想要定期执行某些服务或是启动后执行,或是什么服务启动多久后执行等。在过去,我们都是实验crond这个服务来处理,不过,既然现在有一直常驻在内存当中的systemd这个好用的东西,加上systemd有个辅助服务,名为timer.target的家伙,这家伙可以协助定期处理各种任务。那么,除了crond之外,如何使用systemd内置的timer来处理各种任务?

systemd.timer的优势

  1. 更加精确的时间控制:systemd.timer使用机器可读的时间格式,可以更加精确地控制定时任务的触发时间,支持秒级别的时间控制。
  2. 更加灵活的定时任务控制:systemd.timer相比于cron等工具,可以执行更加复杂的定时任务控制,如每周特定几天执行任务、每月特定几个工作日执行任务等。
  3. 支持条件触发:systemd.timer支持在特定条件下触发定时任务,如特定目录或文件的变化、特定网络事件等。
  4. 可以管理服务:systemd.timer可以直接管理服务,即在特定时间触发服务的启动、停止、重启等操作。
  5. 支持持久化:systemd.timer可以在系统休眠、重启等情况下持久化定时任务,保证任务不会丢失。
  6. 更加可靠的日志记录:systemd.timer使用Journal日志系统,可以更加可靠地记录定时任务的执行情况,支持日志压缩和加密等功能。

虽然还是有些缺点,例如systemd的timer并没有email通知功能(除非自己写一个),也没有类似anacron的一段时间内的随机取样的功能,不过,总体来说还是挺不错的。此外相对于crond最小的单位到分钟,systemd是可以到秒甚至是毫秒。

任务需求

要使用systemd的timer功能,需要满足以下条件:

  1. 系统中必须启动timer.target,timer.target是systemd中专门用来管理定时器的target,系统默认会启动该target。

  2. 必须有一个服务存在,该服务以sname.service的形式命名,其中sname为用户自定义的服务名称,该服务用于执行定时任务。

  3. 必须有一个定时器存在,该定时器以sname.timer的形式命名,其中sname为用户自定义的定时器名称,该定时器用于触发服务的启动、停止等操作。

在满足以上条件的情况下,用户可以通过systemctl命令来管理定时器和服务,如启动、停止、重启定时器和服务等操作。需要注意的是,定时器和服务的配置文件必须放置在systemd的服务配置目录中,通常为/etc/systemd/system/目录。

sname.timer的设置值

Timer部分

设置参数参数意义说明
OnAcitveSec定义定时器首次运行延迟时间,单位为秒。例如,OnActiveSec=5min 表示定时器在服务激活后5分钟后首次运行。
OnBootSec定义定时器启动时间,相对于系统启动时间的延迟时间,单位为秒。例如,OnBootSec=10min 表示定时器在系统启动后10分钟后运行。
OnStartupSec用于指定系统启动后,定时器第一次触发的延迟时间。当OnCalendar和OnStartupSec同时存在时,OnStartupSec指定的时间会覆盖OnCalendar中指定的时间。
OnUnitActiveSec定义定时器启动时间,相对于服务激活时间的延迟时间,单位为秒。例如,OnUnitActiveSec=1h 表示定时器在服务激活后1小时后运行。
OnUnitInactiveSec定义定时器停止时间,相对于服务停止时间的延迟时间,单位为秒。例如,OnUnitInactiveSec=5min 表示定时器在服务停止后5分钟后停止。
OnCalendar定义定时器运行的时间表,以机器可读的时间格式表示。例如,OnCalendar=*-*-* 01:00:00 表示定时器在每天凌晨1点触发。
Unit定义定时器关联的服务名称,即定时器触发后要执行的服务。例如,Unit=mybackup.service 表示定时器关联的服务名称为mybackup.service。
Persistent定义定时器是否持久化,在系统休眠或重启后是否继续运行定时器。例如,Persistent=true 表示定时器持久化。

需要注意的是,以上选项并非全部必须设置,根据实际需求选择设置即可。同时,定时器配置文件必须放置在systemd的服务配置目录中,通常为/etc/systemd/system/目录。

使用于OnCalendar的时间

如果你想要从crontab转成这个timer功能的话,那么要了解时间设置的格式,基本上的格式如下所示:

语法:
英文周名 YYYY-MM-DD HH:MM:SS
 THu    2023-5-15  15:34:00

上面都是基本语法,你也可以直接使用间隔时间来处理。常用的间隔时间单位有:

  • us或usec:微秒(10^-6秒)
  • ms或msec:毫秒(10^-3秒)
  • s、sec、second、seconds
  • m、min、minute、minutes
  • h、hr、hour、hours
  • d、day、days
  • w、week、weeks
  • month、months、
  • y、year、years

常见的使用范例有:

3 小时:          3h或3hr或3hours
隔 300 分钟过 10秒: 10s 300m
隔 5 天又100分钟:   100m 5day
# 通常英文写法是,小写单位写在前面,大单位写后面,所以先秒、再分、再小时、再天数等。

你也可以使用英文常用的口语化日期代表,例如today,tomorrow等。假设今天是2023-5-13 15:45:00 的话

英文口语实际的时间格式代表
nowThu 2023-5-13 15:45:00
todayThu 2023-5-13 00:00:00
tomorrowThu 2023-5-14 00:00:00
hourly*-*-* *:00:00
daily*-*-* 00:00:00
weeklyMon *-*-* 00:00:00
monthly*-*-01 00:00:00
+3h10mThu 2023-5-13 18:45:00
2023-5-20Sun 2023-5-20 00:00:00

一个循环实际运行案例

假设这样:

  • 启动后2小时开始执行一次这个backup.service
  • 自从第一次执行后,未来我每两天要执行一次backup.serivce

那么应该如何处理这个脚本呢?

[root@localhost ~]# vim /etc/systemd/system/backup.timer
[Unit]
Description=backup my server timer
[Timer]
OnBootSec=2h
OnUnitActiveSec=2days
[Install]
WantedBy=multi-user.target
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart backup.timer
[root@localhost ~]# systemctl enable backup.timer
Created symlink from /etc/systemd/system/multi-user.target.wants/backup.timer to /etc/systemd/system/backup.timer.
[root@localhost ~]# systemctl list-unit-files | grep backup
backup.service                      static  # 这个不需要启动,只要enable  backup.service 即可
backup.timer                        enabled 
[root@localhost ~]# systemctl show timers.target
ConditionTimestamp=2023-05-15 14:40:04 CST  # timer这个unit启动的时间
[root@localhost ~]# systemctl show backup.service 
ExecMainExitTimestamp=2023-05-15 16:13:49 CST  # backup.service 上次执行时间
[root@localhost ~]# systemctl show backup.timer |grep Nex
NextElapseUSecMonotonic=2d 1h 33min 49.172309s   # 下一次距离 timer.target 的时间

代码解释:

  1. 编辑backup.timer文件,指定定时器的触发时间和重复周期。OnBootSec=2h指定了在系统启动后2小时后第一次执行备份任务,OnUnitActiveSec=2days指定了备份任务的重复周期,即每2天执行一次备份。
  2. 使用systemctl daemon-reload命令重新加载systemd守护进程,以便读取新的定时器配置。
  3. 使用systemctl restart backup.timer命令重启backup.timer定时器,以便应用新的定时器配置。
  4. 使用systemctl enable backup.timer命令启用backup.timer定时器,以便在系统启动时自动启动该定时器。
  5. 使用systemctl list-unit-files | grep backup命令检查备份服务和定时器的状态。该命令显示backup.service服务已启用,backup.timer定时器已启用且已创建符号链接以确保在系统启动时自动启动该定时器。
  6. 使用systemctl show timers.target命令查看timers.target的状态,其中ConditionTimestamp选项显示定时器最近一次启动的时间,即2023年5月15日14:40:04。
  7. 使用systemctl show backup.service命令查看备份服务的状态,其中ExecMainExitTimestamp选项显示上次备份任务执行的时间,即2023年5月15日16:13:49。
  8. 使用systemctl show backup.timer |grep Nex命令查看下一次备份任务执行的时间,其中NextElapseUSecMonotonic选项显示距离下一次备份任务执行的时间,即2天1小时33分钟49.172309秒。

一个固定日期运行的案例

那如果我希望不管上面如何运行,我都希望星期天凌晨2点运行这个备份程序一遍该怎么做?因为已经存在了backup.timer。所以,这里用backup2.timer来做区别

[root@localhost ~]# vim /etc/systemd/system/backup2.timer
[Unit]
Description=backup my server timer2
[Timer]
OnCalendar=Sun *-*-* 02:00:00
Persistent=true
Unit=backup.service
[Install]
WantedBy=multi-user-target
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart backup2.timer
[root@localhost ~]# systemctl start backup2.timer
[root@localhost ~]# systmectl show backup2.timer
NextElapseUSecRealtime=53y 4month 2w 3d 18h

与循环时间运行差异比较大的地方,在于这个OnCalendar的方法对照的时间并不是times.target的启动时间,而是UNIX标准时间,也就是与1970-01-01 00:00:00 这个时间比较。因此,当你看到最后出现的NextElapseUSecRealtime时,下一次执行还要53年4个月2周3天18时,为什么会这样呢?因为对比的是【日历时间】而不是某个unit的启动时间。

代码解释

  1. 编辑backup2.timer文件,指定定时器的触发时间和重复周期。OnCalendar选项指定了定时器在每个星期日的凌晨2点执行备份任务。
  2. 在[Timer]区块中增加Persistent=true选项,以便使定时器在系统重启后继续运行。
  3. 在[Timer]区块中增加Unit选项,指定定时器触发后需要执行的服务,即backup.service。
  4. 使用systemctl daemon-reload命令重新加载systemd守护进程,以便读取新的定时器配置。
  5. 使用systemctl restart backup2.timer命令重启backup2.timer定时器,以便应用新的定时器配置。
  6. 使用systemctl start backup2.timer命令启动backup2.timer定时器,以便立即启动该定时器。
  7. 使用systemctl show backup2.timer命令查看backup2.timer定时器的状态,其中NextElapseUSecRealtime选项显示下一次备份任务执行的时间,即距离现在53年4个月2周3天18小时。这是由于OnCalendar选项指定了备份任务在每个星期日的凌晨2点执行,而当前时间可能不是星期日凌晨2点,因此下一次备份任务执行的时间距离当前时间比较长。

通过这样的方式,你就可以使用systemd的timer来制作属于你的计划任务了。

Centos 7.X 默认启动的服务

随着Linux 上面的软件支持越来越多,加上自由软件的蓬勃发展,我们可以再Linux上面用的daemons真的越来越多。接下来介绍几个常见的daemons,更多的信息,使用【systemctl list-unit-files --type=service】去查询。

Centos 7.x 默认启动的服务内容

服务名称功能简介
abrtd(系统)abrtd是一个自动化的错误报告工具,能够监控系统中的应用程序和服务,捕获相关信息并生成错误报告,方便开发人员解决问题。除此之外,它还能记录系统日志,提供统一接口和管理命令。
accounts-daemon
(可关闭)
(系统)accounts-daemon服务是Linux系统中的一个系统服务,主要负责管理用户账户信息。
alsa-X
(可关闭)
(系统)alsa-X服务是Linux系统中的一个音频服务,主要提供音频输入和输出功能。
atd(系统)atd服务是Linux系统中的一个计划任务服务,它可以在指定的时间执行一些命令或脚本。
Auditd(系统)auditd服务是Linux系统中的一个审计服务,它可以记录系统中的各种事件,例如用户登录、文件访问、进程创建等,以便后续的审计和安全分析。(/var/log/audit/audit.log)
avahi-daemon
(可关闭)
(系统)avahi-daemon服务是Linux系统中的一个本地网络服务发现服务(mDNS),它能够自动发现本地网络中的其他设备和服务,并提供相应的服务名和IP地址信息,方便用户进行网络通信。
brandboot
rhel-*
(系统)brandbot服务会自动检测系统中安装的软件包,并根据软件包的品牌进行分类和管理。brandbot服务会检查软件包之间的依赖关系,确保不同品牌的软件包之间的兼容性和稳定性。
此外,在RHEL系统中,还有一些以rhel-*开头的服务,例如rhel-dmesgrhel-configure等,它们提供了一些特定于RHEL系统的管理和配置功能,例如查看系统日志、配置系统安全策略等。
chronyd
ntpd
ntpdate
(系统)都是网络校正时间的服务。
cpupower(系统)提供CPU的运行规范,可以参考 /etc/sysconfig/cpupower得到更多的信息。
crond(系统)crond服务是Linux系统中的一个定时任务服务,它可以在指定的时间周期性地执行一些命令或脚本。
cups
(可关闭)
(系统/网络)cups服务是Linux系统中的一个打印服务,它可以将文档和图片等内容打印输出到打印机上。
dbus(系统)dbus服务是Linux系统中的一个进程间通信服务,它可以让不同进程之间进行通信和交互,以实现更加灵活和高效的应用程序设计。
dm-event
multipathd
(系统)监控设备映射的主要服务。
dmraid-activation
mdmonitor
(系统)用来启动Software RAID的重要服务。
dracut-shutdown(系统)dracut-shutdown服务是Linux系统中的一个服务,它主要用于系统的关机过程中进行一些清理和关闭操作,以确保系统正常关机。
ebtables(系统/网络)ebtables服务是Linux系统中的一个网络过滤服务,它可以对以太网帧进行过滤和控制,以实现网络流量的管理和控制。
emergemcy
rescue
(系统)进入紧急模式或是恢复模式的服务
firewalld(系统/网络)就是防火墙
gdm(系统)GNONE的登录管理员,就是图形界面上一个很重要的登录管理服务
getty@(系统)就是要在本机系统产生几个命令界面(tty)登录的服务
hyper*
ksm*
libvirt*
vmtoolsd
(系统)跟建立虚拟机有关的许多服务。
irqbalance(系统)irqbalance服务是Linux系统中的一个服务,它可以管理系统中的中断请求(IRQ)分配,以提高系统的性能和稳定性。在多核处理器系统中,系统中的中断请求可能会分配到不同的CPU核心上,这可能会导致某些CPU核心的负载过重,从而影响系统的性能和稳定性。
iscsi*(系统)可以挂载来自网络驱动器的服务。
kdump(系统)kdump服务是Linux系统中的一个服务,它可以在系统发生严重错误和崩溃时,自动进行内存转储(dump),以便进行故障分析和调试。
lvm2-*LVM2是Linux系统中的一个逻辑卷管理器,它可以对多个硬盘分区进行集成和管理,以提供更灵活、更可靠的存储管理方案。
microcodemicrocode服务是Linux系统中的一个服务,它可以为CPU加载和更新微码固件,以提高CPU的性能和稳定性。微码固件是CPU中的一组指令,用于修复硬件缺陷、实现新功能、提高性能和稳定性等。
ModemManager
network
NetworkManager*
(系统/网络)主要就是调制解调器,网络设置等服务。
quotaon(系统)启动磁盘配额要用到的服务
rc-local(系统)rc-local服务是Linux系统中的一个服务,它可以在系统启动时自动执行用户指定的脚本或命令。
rsyslog(系统)rsyslog服务是Linux系统中的一个服务,它可以管理系统的日志记录和管理。
smartd(系统)smartd服务是Linux系统中的一个服务,它可以监控硬盘的健康状态和性能,并在硬盘出现故障或异常时提供警告。
sysstat(系统)sysstat服务是Linux系统中的一个服务,它可以收集、处理和报告系统的性能数据。
systemd-*(系统)systemd是Linux系统中的一个系统和服务管理器,它可以管理系统的进程、服务、挂载点、网络等方面的配置和管理。
plymount*
upower
(系统)与图形界面的使用相关性较高的一些服务。

上面的服务是Centos 7.x 默认启动的服务很多是针对台式计算机所设计的,所以,如果你的Linux主机用途是再服务器上面的话,那么有很多服务是可以关闭的。

下面介绍一些可能在你的系统当中的服务,只是默认没有启动这个服务。

其他服务的简易说明

服务名称功能简介
dovecot(网络)dovecot是Linux系统中的一个邮件服务软件,它用于提供POP3、IMAP和邮件存储等服务,是一个开源的邮件服务器软件。
httpd(网络)httpd是Linux系统中的一个Web服务器软件,它可以提供静态和动态网页的服务。
named(网络)named是Linux系统中的一个域名解析服务软件,也称为BIND(Berkeley Internet Name Domain)软件。named服务可以提供DNS(Domain Name System)解析服务,将域名解析成IP地址。
nfs
nfs-server
(网络)nfs是Linux系统中的一个网络文件系统协议,它可以使远程计算机像本地文件系统一样访问文件。nfs服务是提供NFS服务的服务器端软件,也称为nfs-server
smb
nmb
(网络)smb是Linux系统中的一个文件共享协议,它可以使远程计算机像本地文件系统一样访问文件。nmb服务是提供smb服务的服务器端软件,也称为smbd
vsftpd(网络)vsftpd服务是作为文件传输服务器(FTP)的服务
sshd(网络)sshd是Linux系统中的一个安全的远程登录服务软件,它可以提供SSH(Secure Shell)协议的服务。sshd服务使用非对称加密(公钥加密)技术,确保远程登录过程中的数据传输安全。
rpcbind(网络)rpcbind是Linux系统中的一个远程过程调用(RPC)服务软件,它为RPC程序提供端口映射服务。
postfix(网络)Postfix是Linux系统中的一个邮件传输代理(MTA)软件,它可以提供电子邮件传输服务。例如crond、atd就会发送email给本机用户。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1545541.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于nodejs+vue铁路订票管理系统python-flask-django-php

该铁路订票管理系统采用前后端分离进行设计&#xff0c;并采用nodejs语言以及express框架进行开发。本系统主要设计并完成了用户登录管理过程、个人信息修改、用户管理、火车类型管理、火车信息管理、车票预订管理、车票退票管理、系统管理等功能。该系统操作简单&#xff0c;界…

考研数学|武忠祥高数全年学习包分享

u1s1&#xff0c;武忠祥老师的课程真的不错&#xff0c;宝藏级老师 其实我觉得没必要对比每一个考研数学老师&#xff0c;汤家凤还有张宇以及武忠祥都是非常受欢迎的老师&#xff0c;也都很有实力&#xff0c;只不过讲课的风格有所区别。 比如汤家凤老师就像是高中那种不苟言…

2024华为产业链企业名单大全(附下载)

更多内容&#xff0c;请前往知识星球下载&#xff1a;https://t.zsxq.com/18fsVdcjA 更多内容&#xff0c;请前往知识星球下载&#xff1a;https://t.zsxq.com/18fsVdcjA

mapbox测距功能重写

// 使用 import MeatureTool from "/components/webgisMap/measureTool";measureDistance() {// ID可以自定义const layerId String(new Date().getTime())this.meatureTool new MeatureTool(this.mapBoxMap)this.meatureTool.measureDistance(layerId)// 防止函数…

动态内存管理-传值调用错题解析

首先我们来看这个错误代码 首先我们看代码逻辑&#xff0c;首先main函数调用test&#xff0c;test接收的是void类型&#xff0c;设置一个指针变量&#xff0c;指向null&#xff0c;传递给get函数&#xff0c;也就是传递一个空指针给getmemory函数&#xff0c;这个函数接收了&a…

单片机入门到精通:一站式在线学习平台!

介绍&#xff1a;单片机&#xff0c;也称为微控制器&#xff08;MCU&#xff09;&#xff0c;是一种集成了中央处理器&#xff08;CPU&#xff09;、随机存储器&#xff08;RAM&#xff09;、只读存储器&#xff08;ROM&#xff09;以及输入/输出接口于单一芯片上的微型计算机。…

设计模式学习笔记 - 设计模式与范式 -结构型:2.桥接模式:如何实现支持不同类型和渠道的消息推送系统?

概述 今天学习另外一种结构型模式&#xff1a;桥接模式。桥接模式的代码实现非常简单&#xff0c;但是理解起来稍微优点难度&#xff0c;并且应用场景也比较局限&#xff0c;所以&#xff0c;相对于代理模式来说&#xff0c;桥接模式在实际的项目中并没有那么常用&#xff0c;…

Spring文件配置以及获取

前言 我们都知道很多应用都是有配置文件的,可以对应用的一些参数进行配置,如conf... 本篇我们讲解关于Spring的配置文件以及程序怎么获取其中写入的参数 Spring中的配置文件主要有三种 还有yml和ymal文件 下面我们将介绍关于常用的两种 preoperties 和 yml文件的格式和读取…

2024年适合个人和普通企业用户的阿里云服务器推荐,最低仅需61元1年

现在不论是个人还是企业&#xff0c;只要有建站&#xff0c;做APP&#xff0c;存储数据等需要就需要一台云服务器。通常来说&#xff0c;购买阿里云服务器的用户主要分为三类&#xff1a;一是个人用户&#xff0c;二是普通企业用户&#xff0c;三是对云服务器性能有特殊需求的集…

libVLC 视频缩放

libvlc是一个常用的开源多媒体框架&#xff0c;它可以用来播放和处理各种类型的音频和视频文件。如果想要缩放视频&#xff0c;可以通过libvlc提供的API来实现。 //设置视频的缩放比例。 libvlc_video_set_scale() 以下是如何使用 libVLC 设置视频缩放的基本步骤&#xff1a;…

【研发管理】研发管理规范

研发管理规范 目的定义工作职责产品经理项目经理运维负责人研发负责人研发工程师 基本原则研发过程描述需求分析分析设计研发实现测试验收发布上线线上监控 目的 软件研发相关管理&#xff0c;有效控制技术风险&#xff0c;提高研发和运行质量 定义 包括需求分析、分析设计…

智慧公厕的全域感知、全网协同、全业务融合和全场景智慧赋能

公共厕所是城市的重要组成部分&#xff0c;为市民提供基本的生活服务。然而&#xff0c;传统的公厕管理模式存在诸多问题&#xff0c;如排队等候时间长、卫生状况差、空气质量差等&#xff0c;严重影响市民的出行和生活质量。为了解决这些问题&#xff0c;智慧公厕应运而生&…

WebClient上载文件——实现将本地文件同步到远端服务器上

问题描述 用户上传产品示例图片到服务器端上&#xff0c;客户端在请求图片资源时&#xff0c;当服务端架设了多个节点的情况下&#xff0c;由于没有负载均衡请求到保存图片资源的服务器&#xff0c;出现图片访问404的问题。 这里保存上传文件时&#xff0c;同时需要将该文件保…

【学习心得】神经网络知识中的符号解释

这里我对我学到的神经网络知识中&#xff0c;常见的符号做一下记录和总结&#xff0c;方便自己在后面学习中复习。下图二分类识别图像识别猫为例。为了保存一张图片&#xff0c;需要三个矩阵&#xff0c;它们分别对应图片中的红、绿、蓝三种颜色通道&#xff0c;如果图片大小为…

vitepress builld报错

问题&#xff1a;build时报错&#xff1a;document/window is not defined。 背景&#xff1a;使用vitepress展示自定义的组件&#xff0c;之前build是没有问题了&#xff0c;由于新增了qr-code以及quill富文本组件&#xff0c;导致打包时报错。 原因&#xff1a;vitepress官…

邮件接口与第三方平台的集成的方式有哪些?

邮件接口如何实现高效通信&#xff1f;怎么有效地利用邮件接口&#xff1f; 邮件接口与第三方平台的集成已经成为了企业提升工作效率、优化用户体验的关键环节。那么&#xff0c;邮件接口与第三方平台的集成方式究竟有哪些呢&#xff1f;接下来&#xff0c;AokSend就来探讨一下…

力扣由浅至深 每日一题.15 删除排序链表中的重复元素

没关系的&#xff0c;昨天的暴雨不会淋湿今天的自己 —— 24.3.26 删除排序链表中的重复元素 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出…

VR全景展示:传统制造业如何保持竞争优势?

在结束不久的两会上&#xff0c;数字化经济和创新技术再度成为了热门话题。我国制造产业链完备&#xff0c;但是目前依旧面临着市场需求不足、成本传导压力加大等因素影响&#xff0c;那么传统制造业该如何保持竞争优势呢&#xff1f; 在制造行业中&#xff0c;VR全景展示的应用…

markdown 编辑工具Typora的使用

简介 Typora是一款由Abner Lee开发的轻量级Markdown编辑器&#xff0c;它以其简洁美观的界面、实时预览的功能以及强大的Markdown语法支持而受到用户的喜爱。 Typora的编辑方式与众不同&#xff0c;它采用了所见即所得的编辑方式&#xff0c;这意味着用户在输入Markdown语法标…

OpenCV4.9关于矩阵上的掩码操作

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:如何使用OpenCV扫描图像、查找表和时间测量 下一篇:OpenCV4.9的是如何进行图像操作 引言&#xff1a; 矩阵上的掩码操作非常简单。这个想法是&#xff0c;我们根据掩码矩阵&#xff08…