【Linux命令】《鸟哥Linux基础》第十七章 认识系统服务(daemon)

第十七章 认识系统服务(daemon)

17.1.2 systemd使用的unit分类

CentOS 7.x 放弃了init启动脚本的方法,改用systemd启动服务管理机制。systemd必有过人之处,它的过人之处就是:

  • 并行处理所有服务,加速开机流程:可以让所有服务同时启动
  • 一经要求就响应的on-demand启动模式:仅是一个systemd服务+systemctl命令来处理,无需其他额外命令的支持;systemd常驻内存,任何要求都可以立即处理
  • 服务依赖性的自我检查:没有先打开它依赖的服务就开了某个服务,systemd会自动帮你启动那个被依赖的服务
  • daemon功能分类:首先定义所有的服务为一个服务单位unit,并将该unit归类到不同的服务类型type中,这些type如:service、socket、target、path、snapshot、timer等,方便管理员分类和记忆
  • 向下兼容旧有的init服务脚本:旧的init启动脚本也能通过systemd管理,只是无法支持更高级的systemd功能。

systemd管理的unit是学习systemd的重要抓手。

systemd的配置文件放置目录

systemd将过去所谓的daemon执行脚本通通称为一个服务单位(unit),而每种服务单位根据功能来区分时,就分成不同的类型type。基本的类型包括:系统服务、数据监听与交换的socket文件服务(socket)、存储系统状态的快照类型、提供不同类似运行级别分类的操作环境target等。配置文件都放在以下目录:

  • /usr/lib/systemd/system/:每个服务最主要的启动脚本设置
  • /run/systemd/system/:系统执行过程中产生的服务脚本,优先级高于上面的
  • /etc/systemd/system/:管理员根据主机系统的需求所建立的执行脚本,执行优先级高于上面两个

到底系统启动会不会执行某些服务看的是 /etc/systemd/system/ 下的设置,整个目录下是一大堆链接文件。

而实际执行的systemd启动脚本配置文件,其实都是放在/usr/lib/systemd/system/下的,所以如果想要修改某个服务启动的设置,其实应该到这个文件夹下去修改。那个/etc/systemd/system/仅仅是链接到正确的执行脚本配置文件而已。

systemd的unit类型分类说明

/usr/lib/systemd/system/下的数据如何区分所谓的不同类型type呢?根据扩展名!!!

[dj@study ~]$ ll /usr/lib/systemd/system | grep -E '(vsftpd|multi|cron)'
-rw-r--r--. 1 root root  318 8月   9 2019 crond.service
-rw-r--r--. 1 root root  623 8月   9 2019 multipathd.service
-rw-r--r--. 1 root root  492 8月   8 2019 multi-user.target
drwxr-xr-x. 2 root root  258 4月  29 21:25 multi-user.target.wants
lrwxrwxrwx. 1 root root   17 4月  29 21:24 runlevel2.target -> multi-user.target
lrwxrwxrwx. 1 root root   17 4月  29 21:24 runlevel3.target -> multi-user.target
lrwxrwxrwx. 1 root root   17 4月  29 21:24 runlevel4.target -> multi-user.target
扩展名主要服务功能
.service一般服务类型。主要是系统服务,包括服务器本身需要的本地服务以及网络服务等,是最常见的类型
.socket内部程序数据交换的socket服务。主要是IPC的传输信息socket文件功能。这种类型的服务通常在监控信息传递的socket文件中,当通过此socket文件传递信息要链接服务时,就根据当时的状态将该用户的要求传送到对应的daemon,若daemon未启动,则启动该daemon后再传送用户的要求。不常用,一般用于本地服务较多,例如图形界面很多的软件是通过socket进行本机程序数据交换的操作。
.target执行环境类型。其实是一群unit的集合,执行multi-user.target其实就是执行一堆其他的.service和.socket之类的服务
.mount .automount文件系统挂载相关的服务。例如来自网络的自动挂载、NFS文件系统挂载等于文件系统相关性较高的进程管理
.path检测特定文件或目录类型。某些服务需要检测某些特定的目录来提供队列服务,如打印服务,通过检测打印队列目录来启动打印功能,此时需要.path的服务类型支持
.timer循环执行的服务。这个服务有点类似anacrontab,不过是由systemd主动提供,比anacrontab更加有弹性

17.2 通过systemctl管理服务

systemd只有systemctl这个命令来操作。

17.2.1 通过systemctl管理单一服务(service unit)的启动/开机启动与查看状态

服务的启动有两个阶段:

  1. 开机的时候设置要不要启动这个服务
  2. 你现在要不要启动这个服务
systemctl [ command ] [unit]
		command 主要有:
				start		立刻启动后面接的unit
				stop		立刻关闭后面接的unit
				restart		立刻重启,就是先stop再start
				reload		不要关闭后面接的unit,重新加载配置文件,让设置生效
				enable		设置下次开机时,后面接的unit会被启动
				disable		设置下次开机时,后面接的unit不会被启动
				status		目前后面接的这个unit的状态,会列出有没有正在执行、开机默认执行与否、登录等信息
				is-active	目前有没有正在运行中
				is-enable	开机时有没有默认要启动这个unit

关闭atd这个服务练练手:

[dj@study ~]$ systemctl status atd.service		看看atd服务当前的状态
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: 【enabled】)
   Active: active (【running】) since 日 2020-06-14 14:31:25 CST; 19min ago
 Main PID: 1234 (atd)
    Tasks: 1
   CGroup: /system.slice/atd.service
           └─1234 /usr/sbin/atd -f

6月 14 14:31:25 study.centos.vbird systemd[1]: Started Job spooling tools.


[dj@study ~]$ systemctl stop atd.service		正常关闭这个服务(而不要用kill -9)


[dj@study ~]$ systemctl status atd.service		再次查看这个服务的状态
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since 日 2020-06-14 14:53:31 CST; 13s ago
  Process: 1234 ExecStart=/usr/sbin/atd -f $OPTS (code=exited, status=0/SUCCESS)
 Main PID: 1234 (code=exited, status=0/SUCCESS)

6月 14 14:31:25 study.centos.vbird systemd[1]: Started Job spooling tools.
6月 14 14:53:31 study.centos.vbird systemd[1]: Stopping Job spooling tools...
6月 14 14:53:31 study.centos.vbird systemd[1]: Stopped Job spooling tools.

不要随便用kill -9 关闭正常的服务,否则systemctl可能无法继续监控该服务,就比较麻烦了。

daemon有4种默认状态和4中当前状态:

选项daemon的状态
4种当前状态active(running) 、 active(exited) 、 active(waiting) 、 inactive
4种默认状态enabled 、 disabled 、static 、 mask
服务启动、关闭、查看 练习

练习1:

[dj@study ~]$ systemctl status chronyd.service
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:chronyd(8)
           man:chrony.conf(5)
           
[dj@study ~]$ systemctl stop chronyd.service
[dj@study ~]$ systemctl disable chronyd.service
[dj@study ~]$ systemctl status cups.service
● cups.service - CUPS Printing Service
   Loaded: loaded (/usr/lib/systemd/system/cups.service; enabled; vendor preset: enabled)
   Active: active (running) since 日 2020-06-14 14:31:25 CST; 40min ago
 Main PID: 1211 (cupsd)
   CGroup: /system.slice/cups.service
           └─1211 /usr/sbin/cupsd -f

6月 14 14:31:25 study.centos.vbird systemd[1]: Started CUPS Printing Service.

练习2:

[dj@study ~]$ systemctl stop cups.service
Warning: Stopping cups.service, but it can still be activated by:
  cups.path
  cups.socket


[dj@study ~]$ systemctl disable cups.service
Removed symlink /etc/systemd/system/multi-user.target.wants/cups.path.
Removed symlink /etc/systemd/system/multi-user.target.wants/cups.service.
Removed symlink /etc/systemd/system/sockets.target.wants/cups.socket.
Removed symlink /etc/systemd/system/printer.target.wants/cups.service.


[dj@study ~]$ netstat -tlunp | grep cups
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)


[dj@study ~]$ su -
密码:
上一次登录:六 6月 13 10:46:14 CST 2020pts/0 上
[root@study ~]$ netstat -tlunp | grep cups		服务已被关闭,啥端口也没有


[root@study ~]$ systemctl start cups.service
[root@study ~]$ systemctl status cups.service cups.socket cups.path
● cups.service - CUPS Printing Service
   Loaded: loaded (/usr/lib/systemd/system/cups.service; disabled; vendor preset: enabled)
   Active: active (running) since 日 2020-06-14 15:14:50 CST; 29s ago
 Main PID: 3667 (cupsd)
    Tasks: 1
   CGroup: /system.slice/cups.service
           └─3667 /usr/sbin/cupsd -f

6月 14 15:14:50 study.centos.vbird systemd[1]: Started CUPS Printing Service.

● cups.socket - CUPS Printing Service Sockets
   Loaded: loaded (/usr/lib/systemd/system/cups.socket; disabled; vendor preset: enabled)
   Active: active (running) since 日 2020-06-14 14:31:13 CST; 44min ago
   Listen: /var/run/cups/cups.sock (Stream)

6月 14 14:31:13 study.centos.vbird systemd[1]: Listening on CUPS Printing Service Sockets.

● cups.path - CUPS Printer Service Spool
   Loaded: loaded (/usr/lib/systemd/system/cups.path; disabled; vendor preset: enabled)
   Active: active (waiting) since 日 2020-06-14 14:31:13 CST; 44min ago

6月 14 14:31:13 study.centos.vbird systemd[1]: Started CUPS Printer Service Spool.



[root@study ~]$ echo "testing" | lp					的确没有连接打印,报错正常
lp: Error - no default destination available.


[root@study ~]$ systemctl status cups.service
● cups.service - CUPS Printing Service
   Loaded: loaded (/usr/lib/systemd/system/cups.service; disabled; vendor preset: enabled)
   Active: active (running) since 日 2020-06-14 15:14:50 CST; 1min 23s ago
 Main PID: 3667 (cupsd)
    Tasks: 1
   CGroup: /system.slice/cups.service
           └─3667 /usr/sbin/cupsd -f

6月 14 15:14:50 study.centos.vbird systemd[1]: Started CUPS Printing Service.



[root@study ~]$ netstat -tlunp | grep cups				服务开启,端口出现!!
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      3667/cupsd          
tcp6       0      0 ::1:631                 :::*                    LISTEN      3667/cupsd 
强迫服务注销的练习

要关闭cups.service:

  • 正规的做法是,关闭cups.service,连同其他两个会唤醒它的cups.socket和cups.path通通关闭,就没事了。
  • 不正规的方法是强制用mask注销cups.service。

不正规的方式(但是很有效!):

[root@study ~]$ systemctl stop cups.service				关停这个服务
Warning: Stopping cups.service, but it can still be activated by:
  cups.path
  cups.socket



[root@study ~]$ systemctl mask cups.service				用mask注销这个服务
Created symlink from /etc/systemd/system/cups.service to /dev/null.	就是把它链接到一个空设备上



[root@study ~]$ systemctl status cups.service			查看服务状态
● cups.service
   Loaded: masked (/dev/null; bad)
   Active: inactive (dead) since 日 2020-06-14 15:26:33 CST; 40s ago
 Main PID: 3667 (code=exited, status=0/SUCCESS)

6月 14 15:14:50 study.centos.vbird systemd[1]: Started CUPS Printing Service.
6月 14 15:26:33 study.centos.vbird systemd[1]: Stopping CUPS Printing Service...
6月 14 15:26:33 study.centos.vbird systemd[1]: Stopped CUPS Printing Service.



[root@study ~]$ systemctl start cups.service			再想唤醒已经唤不醒了
Failed to start cups.service: Unit is masked.



[root@study ~]$ systemctl unmask cups.service			取消对这个服务的注销
Removed symlink /etc/systemd/system/cups.service.


[root@study ~]$ systemctl status cups.service			查看服务状态,又恢复正常了
● cups.service - CUPS Printing Service
   Loaded: loaded (/usr/lib/systemd/system/cups.service; disabled; vendor preset: enabled)
   Active: inactive (dead) since 日 2020-06-14 15:26:33 CST; 4min 40s ago
 Main PID: 3667 (code=exited, status=0/SUCCESS)

6月 14 15:14:50 study.centos.vbird systemd[1]: Started CUPS Printing Service.
6月 14 15:26:33 study.centos.vbird systemd[1]: Stopping CUPS Printing Service...
6月 14 15:26:33 study.centos.vbird systemd[1]: Stopped CUPS Printing Service.

17.2.2 使用systemctl查看系统上的所有服务

上面说的是单一服务的启动、关闭、查看,以及依赖服务要注销的功能。

若想知道系统上总共有多少服务存在,可以用list-unitslist-unit-files查看。

systemctl [ command ] [--type=TYPE] [--all]
			command : list-units:		依据unit显示目前有启动的unit,加上--all才会显示没有启动的unit
					  list-unit-files:	依据/usr/lib/systemd/system/内的文件,将所有文件列表说明
			--type=TYPE : 就是unit类型,主要有service、socket、target等


下面两个命令功能相同:
systemctl
systemctl list-units

只看service类型的服务:
systemctl list-units --type=service --all


查看这些类型是service的服务里,带cpu的:
[root@study ~]$ systemctl list-units --type=service --all | grep cpu
  cpupower.service                                      loaded    inactive dead    Configure CPU power related settings

17.2.3 通过systemctl管理不同的操作系统(target unit)

列出和操作界面有关的target项目:

systemctl list-units --type=target --all
常用target内容
graphical.target就是命令加图形界面。这个项目已经包含了下面的multi-user.target
multi-user.target纯命令行模式
rescue.target在无法使用root登录的情况下,systemd在启动时会多加一个额外的临时系统,让你取得root权限来维护你的系统。
emergency.target紧急处理系统的错误,还是需要使用root登录的情况,在无法使用rescue.target时,可以尝试使用这种模式
shutdown.target关机模式
getty.target可设置你需要几个tty之类的
systemctl [command] [unit.target]
			command : get-default 取得目前的target
					  set-default 设置后面接的target成为默认的操作模式
					  isolate	  切换到后面接的模式




[root@study ~]$ systemctl get-default						查看默认的格式
multi-user.target


[root@study ~]$ systemctl set-default graphical.target		将默认格式修改为图形化界面
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target.


[root@study ~]$ systemctl get-default						查看默认的格式,已经切换好了
graphical.target


[root@study ~]$ systemctl isolate multi-user.target			不关机实现模式切换

其他操作:

systemctl poweroff	系统关机
systemctl reboot	重启
systemctl suspend	进入挂起模式:系统状态保存到内存中,并没有关机
systemctl hibernate	进入休眠模式:系统状态保存到硬盘中,将计算机关机
systemctl rescue	强制进入恢复模式
systemctl emergency	强制进入紧急恢复模式

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

systemctl list-dependencies [unit] [--reverse]
		--reverse  反向追踪谁使用这个unit

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

[root@study ~]$ systemctl get-default		当前的默认模式是图形化界面
graphical.target


[root@study ~]$ systemctl list-dependencies
default.target
● ├─accounts-daemon.service
● ├─gdm.service
● ├─initial-setup-reconfiguration.service
● ├─network.service
● ├─rtkit-daemon.service
● ├─systemd-readahead-collect.service
● ├─systemd-readahead-replay.service
● ├─systemd-update-utmp-runlevel.service
● ├─udisks2.service
● └─multi-user.target
●   ├─abrt-ccpp.service
●   ├─abrt-oops.service
...

查出谁会用到multi-user.target:
正常是,我用到了哪些服务,加上reverse,就是,谁会用到我的服务。

[root@study ~]$ systemctl list-dependencies --reverse
default.target

查看graphical.target用到了哪些服务:同刚开始的

[root@study ~]$ systemctl list-dependencies graphical.target	
graphical.target
● ├─accounts-daemon.service
● ├─gdm.service
● ├─initial-setup-reconfiguration.service
● ├─network.service
● ├─rtkit-daemon.service
● ├─systemd-readahead-collect.service
● ├─systemd-readahead-replay.service
● ├─systemd-update-utmp-runlevel.service
● ├─udisks2.service
● └─multi-user.target
●   ├─abrt-ccpp.service
●   ├─abrt-oops.service
●   ├─abrt-vmcore.service
●   ├─abrt-xorg.service
●   ├─abrtd.service
●   ├─atd.service
...

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

  • 启动脚本配置文件:/usr/lib/systemd/system/ ,优先级低
  • 系统执行过程中所产生的服务脚本:/run/systemd/system , 优先级中
  • 管理员依据主机系统需求建立的执行脚本:/etc/systemd/system/ , 优先级高
  • 服务初始化的一些选项设置:/etc/sysconfig/*
  • 服务运行过程中产生的数据:/var/lib
  • daemon的缓存(lock文件和PID文件等):/run/

查找socket文件在哪:

[root@study ~]$ systemctl list-sockets
LISTEN                          UNIT                         ACTIVATES
/dev/log                        systemd-journald.socket      systemd-journald.service
/run/dbus/system_bus_socket     dbus.socket                  dbus.service
/run/dmeventd-client            dm-event.socket              dm-event.service
/run/dmeventd-server            dm-event.socket              dm-event.service
/run/lvm/lvmetad.socket         lvm2-lvmetad.socket          lvm2-lvmetad.service
/run/lvm/lvmpolld.socket        lvm2-lvmpolld.socket         lvm2-lvmpolld.service
/run/systemd/initctl/fifo       systemd-initctl.socket       systemd-initctl.service
/run/systemd/journal/socket     systemd-journald.socket      systemd-journald.service
/run/systemd/journal/stdout     systemd-journald.socket      systemd-journald.service
/run/systemd/shutdownd          systemd-shutdownd.socket     systemd-shutdownd.service
/run/udev/control               systemd-udevd-control.socket systemd-udevd.service
/var/run/avahi-daemon/socket    avahi-daemon.socket          avahi-daemon.service
/var/run/cups/cups.sock         cups.socket                  cups.service
/var/run/libvirt/virtlockd-sock virtlockd.socket             virtlockd.service
/var/run/libvirt/virtlogd-sock  virtlogd.socket              virtlogd.service
/var/run/rpcbind.sock           rpcbind.socket               rpcbind.service
0.0.0.0:111                     rpcbind.socket               rpcbind.service
0.0.0.0:111                     rpcbind.socket               rpcbind.service
@ISCSIADM_ABSTRACT_NAMESPACE    iscsid.socket                iscsid.service
@ISCSID_UIP_ABSTRACT_NAMESPACE  iscsiuio.socket              iscsiuio.service
[::]:111                        rpcbind.socket               rpcbind.service
[::]:111                        rpcbind.socket               rpcbind.service
kobject-uevent 1                systemd-udevd-kernel.socket  systemd-udevd.service

23 sockets listed.
Pass --all to see loaded but inactive sockets, too.
网络服务与端口对应简介

网址中的http会让浏览器向WWW服务器的80端口发送连接请求,而WWW服务器也会让httpd这个软件监听80端口,这样完成连接。

让服务和端口对应在一起的设置文件是:/etc/services

[root@study ~]$ cat /etc/services | more
...
tcpmux          1/tcp                           # TCP port service multiplexer
tcpmux          1/udp                           # TCP port service multiplexer
rje             5/tcp                           # Remote Job Entry
rje             5/udp                           # Remote Job Entry
echo            7/tcp
echo            7/udp
discard         9/tcp           sink null
discard         9/udp           sink null
systat          11/tcp          users
...

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

17.2.6 关闭网络服务

除了本地服务外,一定要查看网络服务。

虽然网络服务默认是有SELinux管理,还是十分建议手动关闭非必要的网络服务。

什么是网络服务?基本上,会产生一个网络监听端口(port)的进程,就可以被称为网络服务。

如何查看网络端口?用netstat!

[root@study ~]$ 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      1425/master         
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1520/dnsmasq        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1212/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      1425/master         
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
tcp6       0      0 :::22                   :::*                    LISTEN      1212/sshd           
udp        0      0 0.0.0.0:914             0.0.0.0:*                           741/rpcbind         
udp        0      0 192.168.122.1:53        0.0.0.0:*                           1520/dnsmasq        
udp        0      0 0.0.0.0:67              0.0.0.0:*                           1520/dnsmasq        
udp        0      0 0.0.0.0:111             0.0.0.0:*                           1/systemd           
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           761/avahi-daemon: r 
udp        0      0 0.0.0.0:38717           0.0.0.0:*                           761/avahi-daemon: r 
udp6       0      0 :::914                  :::*                                741/rpcbind         
udp6       0      0 :::111                  :::*                                1/systemd           

查看是否有avahi-daemon这个服务:

[root@study ~]$ systemctl list-units --all | grep avahi-daemon
  avahi-daemon.service    loaded    active   running   Avahi mDNS/DNS-SD Stack
  avahi-daemon.socket     loaded    active   running   Avahi mDNS/DNS-SD Stack Activation Socket

追查后发现,avahi-daemon这个服务功能是在局域网内进行类似网络邻居的查找,因此,这个服务可以协助你在局域网内随时了解即插即用的设备,包括笔记本电脑等,只要连上你的局域网,你就能知道谁进来了。

如果你不需要这个协议,关掉它:

[root@study ~]$ systemctl stop avahi-daemon.service				关闭这个服务
Warning: Stopping avahi-daemon.service, but it can still be activated by:
  avahi-daemon.socket


[root@study ~]$ systemctl stop avahi-daemon.socket				关闭这个socket



[root@study ~]$ systemctl disable avahi-daemon.service avahi-daemon.socket	开机不要自启动
Removed symlink /etc/systemd/system/multi-user.target.wants/avahi-daemon.service.
Removed symlink /etc/systemd/system/sockets.target.wants/avahi-daemon.socket.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.Avahi.service.


[root@study ~]$ netstat -tlunp									重新看看端口,avahi的服务不存在了
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      1425/master         
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1520/dnsmasq        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1212/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      1425/master         
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
tcp6       0      0 :::22                   :::*                    LISTEN      1212/sshd           
udp        0      0 0.0.0.0:914             0.0.0.0:*                           741/rpcbind         
udp        0      0 192.168.122.1:53        0.0.0.0:*                           1520/dnsmasq        
udp        0      0 0.0.0.0:67              0.0.0.0:*                           1520/dnsmasq        
udp        0      0 0.0.0.0:111             0.0.0.0:*                           1/systemd           
udp6       0      0 :::914                  :::*                                741/rpcbind         
udp6       0      0 :::111                  :::*                                1/systemd   

17.3 systemctl针对service类型的配置文件

解决如何建立系统服务的问题。

17.3.1 systemctl配置文件相关目录简介

  • /usr/lib/systemd/system/vsftpd.service:官方发布的默认配置文件;
  • /etc/systemd/system/vsftpd.service.d/custom.config:这个目录下的文件会【累加其他设置】到/usr/lib/systemd/system/vsftpd.service中;
  • /etc/systemd/system/vsftpd.service.wants/*:此目录内为链接文件,设置依赖服务的链接,意思是启动vsftpd.service后,最好再加上该目录下面建议的服务;
  • /etc/systemd/system/vsftpd/service.requires/*:此目录内为链接文件,设置依赖服务的链接,意思是再启动vsftpd.service之前,需要事先启动哪些服务的意思。

17.3.2 systemctl配置文件的设置目录简介

配置文件的内容可以分为Unit、Service、Install三个部分。

详见书580页。

17.3.3 两个vsftpd运行的实例

我的虚拟机上找不到vsftpd服务对应的/etc/vsftpd文件夹,暂缓。

17.3.4 多重的重复设置方式:

将tty的数量由6个降低到4个:

[root@study ~]$ vim /etc/systemd/logind.conf
文件中:
[Login]
NAutoVTs=4			这一行将注释取消,把6改成4


[root@study ~]$ systemctl stop getty@tty5.service			如果不小心开启了tty5,想把它关了

[root@study ~]$ systemctl restart systemd-logind.service	重启桌面环境

如果需要启动tty8:

systemctl start getty@tty8.service

17.3.5 自己的服务自己做

制作一个可以备份自己系统的服务,脚本放在/backups下面。

服务的内容:

[root@study ~]$ vim /backups/backup.sh								编写服务脚本
[root@study ~]$ cat /backups/backup.sh 
#!/bin/bash
source="/etc /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


[root@study ~]$ chmod a+x /backups/backup.sh 						给执行权限
[root@study ~]$ ll /backups/backup.sh						
-rwxr-xr-x. 1 root root 221 6月  14 18:20 /backups/backup.sh

服务的启动:

[root@study ~]$ vim /etc/systemd/system/backup.service		编写服务启动脚本
[root@study ~]$ cat /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]
WantedBy=multi-user.target


[root@study ~]$ systemctl daemon-reload						让服务重新加载配置文件
[root@study ~]$ systemctl start backup.service				开启backup.service服务
[root@study ~]$ systemctl status backup.service				查看backup.service服务的状态
● backup.service - backup my server
   Loaded: loaded (/etc/systemd/system/backup.service; disabled; vendor preset: disabled)
   Active: inactive (dead)									这个服务简单,不会常驻内存

6月 14 18:28:49 study.centos.vbird systemd[1]: Started backup my server.
6月 14 18:28:50 study.centos.vbird bash[7955]: job 4 at Sun Jun 14 18:28:00 2020

17.4 systemctl针对timer的配置文件

定期执行某些服务,有两种方法:可以用cron(之前讲了),还可以用systemd+timer来处理。

systemd.timer的优势
  • 因为所有的systemd的服务产生的信息都会被记录(log),所以会比crond在debug上要更加清楚方便
  • 各项timer的任务可以跟systemd的服务相结合
  • 各项timer的任务可以跟control group(cgroup,用来替换/etc/secure/limit.conf的功能)结合,来限制该任务的资源调用

但是没有email的通知功能(除非自己写一个),也没有类似anacron的一段时间内的随机取样功能,不过总体不错。相对于crond最小单位到分钟,systemd是可以到秒,甚至是毫秒!!

任务需求

想要使用systemd的timer功能,必须要有几个要件:

  • 操作系统的timer.target一定要启动
  • 要有个sname.service的服务存在(sname是你自己指定的名称)
  • 要有个sname.timer的时间启动服务存在
sname.timer的设置值

可以去/etc/systemd/system下面去建立这个*.timer文件,这个文件内容可以有下面部分:

设置参数参数意义
OnActiveSec当timers.target启动多久后才执行这个unit
OnBootSec当启动完成后多久后才执行
OnStartupSec当systemd第一次启动后多久财智星
OnUnitActiveSec这个timer配置文件所管理的那个unit服务在最后一次启动后,隔多久再执行一次的意思
OnUnitInactiveSec这个timer配置文件所管理的那个unit服务在最后一次停止后,隔多久再执行一次的意思
OnCalendar使用实际时间(非循环时间)的方式来启动服务
Unit一般来说不用设置。基本上都是sname.server + sname.timer,如果sname不相同时,那么在.timer文件中,就得要指定是哪一个service unit
Persistent当使用OnCalendar的设置时,指定该功能要不要持续进行的意思,通常是设置为yes
使用与OnCalendar的时间
语法:英文周名	YYYY-MM-DD	HH:MM:SS
范例:Thu		2020-06-14	20:03:00


隔3小时:		3h  或  3hr   或   3hours
隔300分钟过10秒:10s 300m
隔5天又100分钟:	100m 5day
一个循环时间运行的案例
  • 启动后2h开始执行一次backups.service
  • 自从第一次执行后,未来每两天要执行一次backup.service
[root@study ~]$ vim /etc/systemd/system/backup.timer		编写.timer脚本
[root@study ~]$ cat /etc/systemd/system/backup.timer
[Unit]
Description=backup my server timer
[Timer]
OnBootSec=2hrs
OnUnitActiveSec=2days
[Install]
WantedBy=multi-user.target


[root@study ~]$ systemctl daemon-reload						重新读入服务配置文件


[root@study ~]$ systemctl enable backup.timer				让这个.timer配置文件生效
Created symlink from /etc/systemd/system/multi-user.target.wants/backup.timer to /etc/systemd/system/backup.timer.	相当于创建了一个链接


[root@study ~]$ systemctl restart backup.timer				重启.timer
[root@study ~]$ systemctl list-unit-files | grep backup		看看目前的情况
backup.service                                disabled		这个service现在不需要开启
backup.timer                                  enabled 		只要这个计时器开启了就行


[root@study ~]$ systemctl show timers.target				可以看看里面的具体配置
[root@study ~]$ systemctl show backup.service
[root@study ~]$ systemctl show backup.timer
一个固定日期运行的案例

上面的是固定周期运行一次,如果不管上面如何执行,都希望星期天凌晨2点运行这个备份程序,做法如下:

[root@study ~]$ vim /etc/systemd/system/backup2.timer		编写.timer文件
[root@study ~]$ cat /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@study ~]$ systemctl daemon-reload						重新读入系统配置文件


[root@study ~]$ systemctl enable backup2.timer				使其生效
Created symlink from /etc/systemd/system/multi-user.target.wants/backup2.timer to /etc/systemd/system/backup2.timer.


[root@study ~]$ systemctl start backup2.timer				开启这个定时器


[root@study ~]$ systemctl show backup2.timer				看看定时器内容
Unit=backup.service
NextElapseUSecRealtime=50y 5month 2w 5d 1h 30min			下次启动时间(与1970-01-01 00:00:00比较)
NextElapseUSecMonotonic=0
LastTriggerUSec=0
LastTriggerUSecMonotonic=0
Result=success
AccuracyUSec=1min
RandomizedDelayUSec=0
Persistent=yes

这样就可以完成自己的计划任务了。

17.5 CentOS 7.x 默认启动的服务概要

超级多。简要挑几个见过的网络服务:

网络服务名称功能简介
dovecot可以设置POP3/IMAP等收发邮件的功能,如果你的Linux主机是邮件服务器才需要这个服务,否则不需要启动它
httpd这个服务可以让你的Linux服务器成为网站服务器
named这个是域名服务器DNS的服务,这个服务非常重要,设置也非常难,暂时不需要
nfs nfs-server这就是Network Filesystem,是UNIX-like之间互相作为网络驱动器的一个功能
smb nmb这个服务可以让Linux模拟成为Windows上面的网络邻居。如果你的Linux主机想要作为Windows客户端的网络驱动服务器,这个要充分使用
vsftpd作为文件传输服务器(FTP)的服务
sshd这个是远程连接服务器的功能,这个通讯协议比telnet好的地方在于sshd在传送数据时可以进行加密,这个服务不要关闭它
rpcbind完成RPC协议的重要服务,包括NFS、NIS等都需要这东西的协助
postfix邮件发送主机,因为系统还是会产生很多email信息,例如crond和atd就会发送email给本机用户,所以这个服务千万不能关

一个练习:将sshd服务的端口号改成222

[root@study ~]$ systemctl status sshd.service			查看sshd服务的状态
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since 日 2020-06-14 14:31:25 CST; 6h ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 1212 (sshd)
   CGroup: /system.slice/sshd.service
           └─1212 /usr/sbin/sshd -D

6月 14 14:31:25 study.centos.vbird systemd[1]: Starting OpenSSH server daemon...
6月 14 14:31:25 study.centos.vbird sshd[1212]: Server listening on 0.0.0.0 port 22.
6月 14 14:31:25 study.centos.vbird sshd[1212]: Server listening on :: port 22.
6月 14 14:31:25 study.centos.vbird systemd[1]: Started OpenSSH server daemon.




[root@study ~]$ cat /usr/lib/systemd/system/sshd.service	查看服务配置信息
[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]
WantedBy=multi-user.target
[root@study ~]$ cd /etc/ssh
[root@study ssh]$ cp sshd_config sshd_config2
[root@study ssh]$ vim sshd_config2
[root@study ssh]$ cd /etc/systemd/system
[root@study system]$ cd /etc/ssh
[root@study ssh]$ cp sshd_config sshd2_config
[root@study ssh]$ rm -f sshd_config2 
[root@study ssh]$ vim sshd2_config 
[root@study ssh]$ cat /usr/lib/systemd/system/sshd.service
[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]
WantedBy=multi-user.target



[root@study ssh]$ cd /etc/systemd/system	$(这个只是为了注释的醒目,下同。去重新建立一个端口为222的sshd2配置文件)
[root@study system]$ cp /usr/lib/systemd/system/sshd.service sshd2.service
[root@study system]$ vim sshd2.service 		$(在里面加一句Port 222)



[root@study system]$ systemctl daemon-reload
[root@study system]$ systemctl enable sshd2
Created symlink from /etc/systemd/system/multi-user.target.wants/sshd2.service to /etc/systemd/system/sshd2.service.


[root@study system]$ systemctl start sshd2
Job for sshd2.service failed because the control process exited with error code. See "systemctl status sshd2.service" and "journalctl -xe" for details.


[root@study system]$ tail -n 20 /var/log/messages
Jun 14 21:01:01 study systemd: Started Session 56 of user root.
Jun 14 21:01:02 study systemd: Removed slice User Slice of root.
Jun 14 21:09:30 study systemd: Reloading.
Jun 14 21:09:30 study systemd: [/etc/systemd/system/backup.timer:4] Failed to parse timer value, ignoring: 2hrs
Jun 14 21:09:41 study systemd: Reloading.
Jun 14 21:09:41 study systemd: [/etc/systemd/system/backup.timer:4] Failed to parse timer value, ignoring: 2hrs
Jun 14 21:09:58 study systemd: Starting OpenSSH server daemon 2...
Jun 14 21:09:58 study systemd: sshd2.service: main process exited, code=exited, status=255/n/a
Jun 14 21:09:58 study systemd: Failed to start OpenSSH server daemon 2.
Jun 14 21:09:58 study systemd: Unit sshd2.service entered failed state.
Jun 14 21:09:58 study systemd: sshd2.service failed.
Jun 14 21:09:58 study dbus[773]: [system] Activating service name='org.fedoraproject.Setroubleshootd' (using servicehelper)
Jun 14 21:10:01 study systemd: Created slice User Slice of root.
Jun 14 21:10:01 study systemd: Started Session 58 of user root.
Jun 14 21:10:01 study systemd: Started Session 57 of user root.
Jun 14 21:10:02 study dbus[773]: [system] Successfully activated service 'org.fedoraproject.Setroubleshootd'
Jun 14 21:10:03 study setroubleshoot: SELinux is preventing /usr/sbin/sshd from name_bind access on the tcp_socket port 222. For complete SELinux messages run: sealert -l c6d32adb-a8d3-4150-b729-9de29c9fa05c
Jun 14 21:10:03 study python: SELinux is preventing /usr/sbin/sshd from name_bind access on the tcp_socket port 222.#012#012*****  Plugin bind_ports (99.5 confidence) suggests   ************************#012#012If you want to allow /usr/sbin/sshd to bind to network port 222#012Then you need to modify the port type.#012Do#012# semanage port -a -t PORT_TYPE -p tcp 222#012    where PORT_TYPE is one of the following: ssh_port_t, vnc_port_t, xserver_port_t.#012#012*****  Plugin catchall (1.49 confidence) suggests   **************************#012#012If you believe that sshd should be allowed name_bind access on the port 222 tcp_socket by default.#012Then you should report this as a bug.#012You can generate a local policy module to allow this access.#012Do#012allow this access for now by executing:#012# ausearch -c 'sshd' --raw | audit2allow -M my-sshd#012# semodule -i my-sshd.pp#012
Jun 14 21:10:03 study setroubleshoot: SELinux is preventing /usr/sbin/sshd from name_bind access on the tcp_socket port 222. For complete SELinux messages run: sealert -l c6d32adb-a8d3-4150-b729-9de29c9fa05c
Jun 14 21:10:03 study python: SELinux is preventing /usr/sbin/sshd from name_bind access on the tcp_socket port 222.#012#012*****  Plugin bind_ports (99.5 confidence) suggests   ************************#012#012If you want to allow /usr/sbin/sshd to bind to network port 222#012Then you need to modify the port type.#012Do#012# semanage port -a -t PORT_TYPE -p tcp 222#012    where PORT_TYPE is one of the following: ssh_port_t, vnc_port_t, xserver_port_t.#012#012*****  Plugin catchall (1.49 confidence) suggests   **************************#012#012If you believe that sshd should be allowed name_bind access on the port 222 tcp_socket by default.#012Then you should report this as a bug.#012You can generate a local policy module to allow this access.#012Do#012allow this access for now by executing:#012# ausearch -c 'sshd' --raw | audit2allow -M my-sshd#012# semodule -i my-sshd.pp#012


[root@study system]$ semanage port -a -t ssh_port_t -p tcp 222
[root@study system]$ systemctl start sshd2
[root@study system]$ netstat -tlnp | grep ssh
tcp        0      0 0.0.0.0:222             0.0.0.0:*               LISTEN      10167/sshd          
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1212/sshd           
tcp6       0      0 :::222                  :::*                    LISTEN      10167/sshd          
tcp6       0      0 :::22                   :::*                    LISTEN      1212/sshd  
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值