CentOS 7.x 放弃了init启动脚本的方法,改用systemd启动服务管理机制。systemd必有过人之处,它的过人之处就是:
on-demand
启动模式:仅是一个systemd服务+systemctl命令来处理,无需其他额外命令的支持;systemd常驻内存,任何要求都可以立即处理daemon
功能分类:首先定义所有的服务为一个服务单位unit,并将该unit归类到不同的服务类型type中,这些type如:service、socket、target、path、snapshot、timer等,方便管理员分类和记忆systemd管理的unit是学习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/
仅仅是链接到正确的执行脚本配置文件而已。
/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更加有弹性 |
systemd只有systemctl这个命令来操作。
服务的启动有两个阶段:
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:
不正规的方式(但是很有效!):
[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.
上面说的是单一服务的启动、关闭、查看,以及依赖服务要注销的功能。
若想知道系统上总共有多少服务存在,可以用list-units
和list-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
列出和操作界面有关的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 强制进入紧急恢复模式
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
...
查找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/封包协议> <该服务的说明>
除了本地服务外,一定要查看网络服务。
虽然网络服务默认是有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
解决如何建立系统服务的问题。
/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之前,需要事先启动哪些服务的意思。配置文件的内容可以分为Unit、Service、Install三个部分。
详见书580页。
我的虚拟机上找不到vsftpd服务对应的/etc/vsftpd文件夹,暂缓。
将tty的数量由6个降低到4个:
[root@study ~]$ vim /etc/systemd/logind.conf
文件中:
[Login]
NAutoVTs=4 这一行将注释取消,把6改成4
[root@study ~]$ systemctl stop [email protected] 如果不小心开启了tty5,想把它关了
[root@study ~]$ systemctl restart systemd-logind.service 重启桌面环境
如果需要启动tty8:
systemctl start [email protected]
制作一个可以备份自己系统的服务,脚本放在/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
定期执行某些服务,有两种方法:可以用cron(之前讲了),还可以用systemd+timer来处理。
control group
(cgroup,用来替换/etc/secure/limit.conf的功能)结合,来限制该任务的资源调用但是没有email
的通知功能(除非自己写一个),也没有类似anacron
的一段时间内的随机取样功能,不过总体不错。相对于crond
最小单位到分钟,systemd
是可以到秒,甚至是毫秒!!
想要使用systemd的timer功能,必须要有几个要件:
timer.target
一定要启动sname.service
的服务存在(sname是你自己指定的名称)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 |
语法:英文周名 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
[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
这样就可以完成自己的计划任务了。
超级多。简要挑几个见过的网络服务:
网络服务名称 | 功能简介 |
---|---|
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给本机用户,所以这个服务千万不能关 |
[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