达成某个服务(service)需要一个守护进程(daemon)在后台运行。
daemon守护进程通常在service服务的名称后加上一个d
开机过程中系统核心第一支呼叫的程序是 init,然后 init 唤起所有的系统所需的服务。
所有服务的启动脚本都放在 /etc/init.d/ 目录下
启动:/etc/init.d/服务名 start
停止:/etc/init.d/服务名 stop
重启:/etc/init.d/服务名 restart
查看:/etc/init.d/服务名 status
根据服务是独立启动或被一支总管程序管理分为两类
独立启动(stand alone):服务独立启动,该服务直接常驻内存,为本机或用户提供服务,反应速度快。
总管程序:(super daemon):由特殊的xinetd或inetd这两个总管程序提供socket对应或port对应的管理。当没有用户需求某socket或port时,所需要的服务不会被启动;当有用户需求时,xinetd会去唤醒对应的服务程序;当需求结束时,被唤醒的服务也会被结束。反应稍慢。
init在管理员手动处理服务时,无法唤醒相依的服务
共7个等级:
各个等级的启动脚本是通过 /etc/rc.d/rc[0-6]/Sxxdaemon 链接到 /etc/init.d/daemon;
Sxxdaemon功能为:
开机启动:chkconfig 服务名 on
开启不启动:chkconfig 服务名 off
查看是否开机启动:chkconfig --list 服务名
将某服务加入chkconfig管理:chkconfig --add 服务名
将某服务从chkconfig中删除:chkconfig --del 服务名
设定服务启动级别为2345:chkconfig --level 2345 服务名 on/off
将程序命令或脚本的绝对路径写入至 /etc/rc.d/rc.local 中
以httpd服务手动设置为开机自启
- [root@localhost ~]# cat /etc/rc.d/rc.local
- #!/bin/sh
- #
- # This script will be executed *after* all the other init scripts.
- # You can put your own initialization stuff in here if you don't
- # want to do the full Sys V style init stuff.
-
- touch /var/lock/subsys/local
- /usr/sbin/apachectl start
固定写法部分
- #!/bin/bash
- # chkconfig: - 96 3
- # description: This is test service script
-
- . /etc/init.d/functions
-
- start(){
- [ -e /var/lock/subsys/testsrv ] && exit || touch /var/lock/subsys/testsrv
- echo $PATH
- action "Starting testsrv"
- sleep 3
- }
- stop(){
- [ -e /var/lock/subsys/testsrv ] && rm /var/lock/subsys/testsrv || exit
- action "Stopping testsrv"
- }
-
- status(){
- [ -e /var/lock/subsys/testsrv ] && echo "testsrv is running..." || echo "testsrv is stopped"
- }
-
- case $1 in
- start)
- start
- ;;
- stop)
- stop
- ;;
- restart)
- stop
- start
- ;;
- status)
- status
- ;;
- *)
- echo $"Usage: $0 {start|stop|status|restart}"
- exit 2
- esac
init 数字
centos7以后,弃用init,改用systemd。优点如下:
ServiceUnit | 用于定义一个系统服务 |
TargetUnit | 用于将多个Unit组成一个组 |
DeviceUnit | 用于描述硬件设备 |
MountUnit | 用于文件系统的挂载点 |
AutomountUnit | 用于自动挂载点 |
PathUnit | 用于定义文件或路径 |
ScopeUnit | 用于描述不是由Systemd启动的外部进程 |
SliceUnit | 用于进程组 |
SnapshotUnit | 用于Systemd快照,可以回溯到某个快照 |
SocketUnit | 用于进程间通信的socket |
SwapUnit | 用于swap文件 |
TimerUnit | 用于定时器 |
注意:若某个服务是管理员手动启动的,不是使用systemctl启动的,那么systemd将无法侦测到该服务且无法管理
这是系统默认的systemd配置文件目录。在这个目录中,可以创建和修改自定义的systemd服务单元配置文件。这些配置文件定义了服务的名称、依赖项、启动顺序、运行环境等等。
这是系统级别的systemd配置文件目录。在这个目录中,通常包含一些系统级别的服务和应用程序的配置文件。这些配置文件通常由软件包管理器在安装过程中自动创建和更新。类似CentOS6中的 /etc/init.d 目录
这是用户级别的systemd配置文件目录。在这个目录中,可以创建和修改用户级别的服务单元配置文件。这些配置文件只在当前用户的主目录下有效,不会影响其他用户。
这是运行时创建的systemd配置文件目录。在这个目录中,会存储正在运行的服务单元的配置文件。这些配置文件只在当前会话中有效,当系统重新启动时,这些配置文件会被清除。
查看httpd服务状态
- [root@wenzi ~]# systemctl status httpd
- ● httpd.service - The Apache HTTP Server 描述服务
- Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled) 服务已加载,未设置开机自启,厂商预设不开机自启
- Active: active (running) since Wed 2023-10-18 04:56:09 CST; 3s ago httpd服务状态
- ...
设置为开机自启
- [root@wenzi ~]# systemctl enable httpd
- Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
由此可见,enable实际通过链接将 httpd.service 挂在了multi-user.target下,而Linux开机流程中会加载multi-user.target,所以实现开机时启动。
取消开机自启
- [root@wenzi ~]# systemctl disable httpd
- Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
由此可见,disable实际是删除了挂在multi-user.target下的httpd链接文件
- [root@wenzi ~]# systemctl mask httpd
- Created symlink from /etc/systemd/system/httpd.service to /dev/null.
- [root@wenzi ~]# systemctl status httpd
- ● httpd.service
- Loaded: masked (/dev/null; bad)
- Active: inactive (dead)
-
- Oct 18 04:56:09 wenzi.localhost systemd[1]: Starting The Apache HTTP Server...
- Oct 18 04:56:09 wenzi.localhost httpd[68352]: AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using wenzi.localhost. Set the 'ServerNam...this message
- Oct 18 04:56:09 wenzi.localhost systemd[1]: Started The Apache HTTP Server.
- Oct 18 05:06:06 wenzi.localhost systemd[1]: Stopping The Apache HTTP Server...
- Oct 18 05:06:07 wenzi.localhost systemd[1]: Stopped The Apache HTTP Server.
- Hint: Some lines were ellipsized, use -l to show in full.
- [root@wenzi ~]# systemctl start httpd
- Failed to start httpd.service: Unit is masked.
-
- 恢复
- [root@wenzi ~]# systemctl unmask httpd
- Removed symlink /etc/systemd/system/httpd.service.
-
注销的实质是让启动的脚本指向 /dev/null
systemctl 等价于 systemctl list-units
- [root@wenzi ~]# systemctl list-unit-files
- UNIT FILE STATE
- ...
- crond.service enabled
- httpd.service disabled
- [root@wenzi ~]# systemctl list-units --type=service
- UNIT LOAD ACTIVE SUB DESCRIPTION
- auditd.service loaded active running Security Auditing Service
- crond.service loaded active running Command Scheduler
- [root@wenzi ~]# systemctl list-sockets
- LISTEN UNIT ACTIVATES
- /dev/log systemd-journald.socket systemd-journald.service
- /run/dbus/system_bus_socket dbus.socket dbus.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
- kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service
- [root@wenzi ~]# cat /etc/services
- 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
- ...
- ssh 22/tcp # The Secure Shell (SSH) Protocol
- ...
和操作界面相关性较高的target主要有:
永久设置为图形界面,重启生效
- [root@wenzi ~]# systemctl get-default
- multi-user.target
- [root@wenzi ~]# 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@wenzi ~]# reboot
临时改变为图形界面,不重启即可生效
[root@wenzi ~]# systemctl isolate graphical.target
其它命令
systemctl poweroff | 系统关机 |
systemctl reboot | 重启 |
systemctl suspend | 进入暂停(睡眠)模式 |
systemctl hibernate | 进入休眠模式 |
systemctl rescue | 强制进入救援模式 |
systemctl emergency | 强制进入紧急救援模式 |
suspend:指的是除了内存以外的大部分机器部件都进入断电状态,并未实际关机,当唤醒机器时,数据会从内存中恢复,重启驱动大部分的机器硬件,开始正常工作,唤醒速度快。
hibernate:将系统状态保存到硬盘中,然后关闭所有设备,当唤醒机器时,数据从硬盘中读取,唤醒速度较慢
multi-user.target 使用哪些unit
- [root@wenzi ~]# systemctl list-dependencies multi-user.target
- multi-user.target
- ● ├─auditd.service
- ● ├─crond.service
- ● ├─dbus.service
- ...
哪些unit使用multi-user.target
- [root@wenzi ~]# systemctl list-dependencies multi-user.target --reverse
- multi-user.target
- ● └─graphical.target
以vsftpd为例,若要额外修改 vsftpd.service 时,可参考:
以sshd.service为例
[root@wenzi ~]# 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
Description | 服务的简介说明。 systemctl list-units的Description列 systemctl status sshd的第一行内容 |
Documentaion | 提供文件查询帮助功能。格式:
|
After | 此处指定的unit必须在当前unit之 前 启动 |
Before | 此处指定的unit必须在当前unit之 后 启动 |
Requires | 此处指定的unit必须在当前unit之 前 启动,否则当前unit启动失败 |
Wants | 此处指定的unit必须在当前unit之 后 启动,不影响当前unit |
Conflicts | 表示冲突的服务,此处指定的unit和当前unit只能有一个可以启动。 |
Type | daemon的启动方式,影响ExecStart。
|
EnvironmentFile | 指定启动脚本的环境配置文件 |
ExecStart | 实际启动此daemon的命令或脚本程序 |
ExecStartPre | 执行ExecStart前执行的命令 |
ExecStartPost | 执行ExecStart后执行的命令 |
ExecStop | 实际停止服务的命令,与systemctl stop 有关 |
ExecReload | 实际重启服务的命令,与systemctl reload 有关 |
Restart | 定义自动重启当前服务的情形。如
|
RemainAfterExit | 当此值为1时,此daemon所属的所有程序都终止后,会再次尝试启动 |
TimeoutSec | 此服务未能正常启动或正常终止时,等待多久强制结束 |
KillMode |
|
RestartSec | 此服务被关闭需要重新启动时,间隔多久,预设100ms |
WantedBy | 后面大部分接 .target unit,此unit归属哪个target unit,大多数服务性质的unit都在 multi-user.target |
Also | 当前unit本身被enable时,此处接的unit也enable |
Alias | 进行一次软链接 |