Linux系统服务

文章目录

  • 什么是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给本机用户。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round 930 (Div. 2) --- D. Pinball --- 题解

目录 D. Pinball&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 代码实现&#xff1a; 代码一&#xff1a; 代码二&#xff1a; D. Pinball&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 假设字符串为 >>><<<&#xff0c; 当前位…

程序员35岁会失业吗?【来自主流AI的回答】

程序员35岁会失业吗&#xff1f; 35岁被认为是程序员职业生涯的分水岭&#xff0c;许多程序员开始担忧自己的职业发展是否会受到年龄的限制。有人担心随着年龄的增长&#xff0c;技术更新换代的速度会使得资深程序员难以跟上&#xff1b;而另一些人则认为&#xff0c;丰富的经…

STM32CubeIDE基础学习-USART串口通信实验(轮询方式)

STM32CubeIDE基础学习-USART串口通信实验&#xff08;轮询方式&#xff09; 文章目录 STM32CubeIDE基础学习-USART串口通信实验&#xff08;轮询方式&#xff09;前言第1章 硬件介绍第2章 工程配置2.1 工程外设配置部分2.2 生成工程代码部分 第3章 代码编写3.1 串口发送3.1.1 发…

SqlServer期末复习(数据库原理及应用)持续更新中

一、SQL语句 1.1 SQL语句知识引入 1.DDL语言(数据定义语言&#xff09;主要是进行定义/改变表的结构、数据类型、表之间的链接等操作&#xff0c;关键字CREATE、DROP、ALTER CREATE TABLE 表面( 列名1 数据类型&#xff0c; 列名2 数据类型&#xff0c; ) ALTER TABLE 表名&a…

[计算机效率] 文件查重工具:Vistanita Duplicate Finder

3.6 文件查重工具&#xff1a;Vistanita Duplicate Finder Vistanita Duplicate Finder 是一款强大的文件查重工具&#xff0c;可以帮助用户快速查找并删除重复的文件&#xff0c;节省存储空间并提高文件管理效率。该软件支持多种文件类型&#xff0c;包括图片、文档、音频、视…

el-table 表格中插入表单循环校验

<template><div>{{form}}<el-form :model"form" ref"form"><el-form-item label"呃呃呃呃呃呃呃"><el-table :data"tableData" border><el-table-column prop"time" label"日期"…

cookie、localStorage、sessionStorage 详解

目录 cookie 是什么&#xff1f; cookie 不可以跨域请求 cookie 的属性 会话cookie & 永久性cookie cookie 禁用 cookie 的应用 sessionStorage 是什么&#xff1f; 失效时间 存储内容的类型 存储的大小 存储的位置 sessionStorage 的应用 localStorage 是什么…

Linux内核架构和基础概念

文章目录 前言 一、简述操作系统 二、宏内核和微内核 1.宏内核 2.微内核 3.Linux内核的特点 三&#xff0c;Linux内核架构 1.整体架构图 2.Linux子系统的划分 3.Linux子系统之间的关系 4.Linux内核目录介绍 总结 前言 随着Linux内核在全球市场份额的持续扩大&#xff0c;其影…

使用WebClient发起网络请求

目录 1、导入对应的pom 2、编写WebClientUtil请求工具类 3、使用WebClientUtil发起请求 使用WebClient的优点&#xff1a;支持lambdas 的函数&#xff1b;支持更高的并发性和更少的硬件资源&#xff1b;支持同步和异步&#xff1b;支持流式传输。具体的使用方式如下&#xff1a…

Redis 特性,为什么要用Redis,Redis到底是多线程还是单线程

一、Redis介绍 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的&#xff0c;使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 二、特性(为什么要用Redis&#x…

51单片机入门:定时器与中断系统

定时器的介绍 定时器&#xff1a;51单片机的定时器属于单片机的内部资源&#xff0c;其电路的设计连接和运转均在单片机内部完成。根据单片机内部的时钟或者外部的脉冲信号对寄存器中的数据加1&#xff0c;定时器实质就是加1计数器。因为又可以定时又可以计数&#xff0c;又称…

数据结构——排序之冒泡排序

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

HarmonyOS入门笔记1配置环境

文章目录 下载安装DevEco Studio配置环境先认识DevEco Studio界面工程目录工程级目录模块级目录 app.json5module.json5main_pages.json通知栏预览区 运行模拟器 下载安装DevEco Studio 去官网下载DevEco Studio完了安装 配置环境 打开已安装的DevEco Studio快捷方式进入配置…

Python爬虫:爬虫基本概念、流程及https协议

本文目录&#xff1a; 一、爬虫的基本概念1.为什么要学习爬虫1.1 数据的来源1.2 爬取到的数据用途 2.什么是爬虫3. 爬虫的更多用途 二、爬虫的分类和爬虫的流程1.爬虫的分类2.爬虫的流程3.robots协议 三、爬虫http和https1.http和https的概念2.浏览器发送HTTP请求的过,2.1 http…

【数据结构刷题专题】—— 二分查找

二分查找 二分查找模板题&#xff1a;704. 二分查找 二分查找前提&#xff1a; 有序数组数组中无重复元素 左闭右闭&#xff1a; class Solution { public:int search(vector<int>& nums, int target) {int left 0;int right nums.size() - 1;while (left <…

An Experimental Study of State-of-the-Art Entity Alignment Approaches论文阅读

最先进的实体对齐方法的实验研究综述 Title: An Experimental Study of State-of-the-Art Entity Alignment Approaches 日期: 2022 发表单位: IEEE github: https://github.com/DexterZeng/EAE 原文地址: https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber9174835 概括…

启扬RK3568核心板助力智慧步道轻装健身,打造全民健康生活新方式

随着物联网、AI智能等新技术的快速发展&#xff0c;智慧步道成为全国各地公园建设和全民健身公共服务设施改造的新主题。智慧步道基于物联网、人脸识别、大数据分析等技术&#xff0c;对人们的运动进行监测和数据采集&#xff0c;显示运动数据&#xff0c;包括里程统计、热量消…

档案四性检测可复用组件接口说明

nhdeep提供在归档、移交与接收、长期保存等各环节根据需求进行自主配置和调用的可复用组件&#xff0c;支持客户端和接口调用两种功能使用模式。档案四性检测组件为自建档案管理系统和各种业务系统&#xff08;如OA&#xff09;&#xff0c;提供标准化的档案四性检测功能利用&a…

YOLOv5改进系列:主干ConvNeXTV2结构助力涨点

一、论文理论 论文地址&#xff1a;ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders 1.理论思想 ConvNeXt V2 在 ConvNeXt 的基础上增加了两个创新点&#xff08;一个 framework 和一个 technique&#xff09;&#xff1a;全卷积掩码自编码器&…

人工智能 框架 paddlepaddle 飞桨 使用指南 使用例子 线性回归模型demo 1

安装过程&使用指南&线性回归模型 使用例子 本来预想 是安装 到 conda 版本的 11.7的 但是电脑没有gpu 所以 安装过程稍有变动,下面简单讲下 conda create -n paddle_env117 python=3.9 由于想安装11.7版本 py 是3.9 所以虚拟环境名称也是 paddle_env117 activa…