系统服务的随意操作可能会带来无法预料的后果,请谨慎操作。
比如服务器程序(Server)、数据库管理系统(DBMS)。
不可能一直放在前台运行,一旦断开 SSH 连接,程序会被终止。
还有一些程序是在开机时运行的,有一些还要常驻在后台,提供系统、网络服务。
其中一些被称之为守护进程(daemon)或服务(service)。
很多守护进程的名称会以 d
结尾。
d
结尾的进程ding@ding-server:~$ ps aux | awk 'NR != 1{print $11}' | grep -E '(.+d$|.+d\]$|.+d\:)' | sort -u
[khugepaged]
[kworker/3:1H-kblockd]
[kworker/u8:0-events_unbound]
/lib/systemd/systemd
/lib/systemd/systemd-journald
/lib/systemd/systemd-udevd
mysqld
sshd:
/usr/bin/containerd
/usr/bin/dockerd
/usr/bin/vmtoolsd
/usr/sbin/atd
/usr/sbin/rsyslogd
[watchdogd]
...
早期使用 System V init:
init
,由它启动其他的服务/etc/init.d/
中,为 Shell 脚本,对服务的操作皆通过执行脚本实现service
命令操作,是否开机启动通过 chkconfig
命令管理现在的大部分发行版使用 systemd:
systemd 架构图,作者 Shmuel Csaba Otto Traian (CC BY-SA 3.0):
守护进程的执行脚本通称为服务单位(unit),每种服务单位根据功能区分时,分为不同类型。
存放目录(按优先级从高到低):
/etc/systemd/system
:管理员根据主机需求建立的服务脚本/run/systemd/system
:系统执行过程中产生的服务脚本/usr/lib/systemd/system
:每个服务最重要的启动脚本设置服务单位类型的区分可看扩展名。
service
:一般服务socket
:套接字服务target
:操作环境mount
/ automount
:文件系统挂载相关服务path
:检测特定文件或目录timer
:循环执行的服务systemctl
管理服务systemctl 命令 服务名
命令:
start
:启动stop
:停止restart
:重启reload
:重新加载配置文件(不关闭)enable
:设置开机启动disable
:取消开机启动mask
:强制注销(防止被其他服务唤醒)unmask
:取消注销status
:查看状态is-active
:查看是否运行中is-enable
:查看是否开机启动active (running)
:正在运行active (exited)
:仅执行一次,正常结束,目前没有进程在运行active (waiting)
:正在运行,但需等待其他事件发生inactive
:没有运行enabled
:开机启动disabled
:开机不启动static
:不可以开机启动,不过可能被其他服务唤醒mask
:被强制注销,无法启动ding@ding-server:~$ sudo systemctl stop atd.service
# 操作服务时,如果无输出则一般没有问题;如果有输出,请查看输出信息
ding@ding-server:~$ systemctl status atd.service
● atd.service - Deferred execution scheduler
Loaded: loaded (/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Wed 2022-06-01 17:20:45 CST; 2s ago
Docs: man:atd(8)
Process: 824 ExecStart=/usr/sbin/atd -f (code=exited, status=0/SUCCESS)
Main PID: 824 (code=exited, status=0/SUCCESS)
May 23 13:59:39 hcm0153 systemd[1]: Starting Deferred execution scheduler...
May 23 13:59:39 hcm0153 systemd[1]: Started Deferred execution scheduler.
Jun 01 17:20:45 hcm0153 systemd[1]: Stopping Deferred execution scheduler...
Jun 01 17:20:45 hcm0153 systemd[1]: atd.service: Succeeded.
Jun 01 17:20:45 hcm0153 systemd[1]: Stopped Deferred execution scheduler.
结构如图:
systemctl list-units
示例systemctl list-unit-files
示例各列:
是一群单位的集合,执行操作环境就是执行这一群单位。
比较重要的环境:
graphical.target
:命令加上图形界面(最常用)multi-user.target
:纯命令行模式rescue.target
:恢复模式emergency.target
:紧急恢复模式,紧急处理系统错误的模式shutdown.target
:关机模式getty.target
:限制 tty 数量的模式systemctl
操作环境操作systemctl 命令
get-default
:获取当前环境set-default 操作环境
:设置默认操作环境为给定操作环境isolate 操作环境
:切换到给定操作环境poweroff
:关机reboot
:重启suspend
:挂起数据放在内存,关闭大部分硬件,唤醒后很快恢复hibernate
:休眠数据放在硬盘,关机,再开机恢复rescue
:强制进入恢复模式emergency
:强制进入紧急恢复模式systemctl
分析各服务之间的依赖性命令结构:
以 ssh.service
为例:
[Unit]
Description=OpenBSD Secure Shell server # 简易说明
Documentation=man:sshd(8) man:sshd_config(5) # 文档信息
After=network.target auditd.service # 在哪个守护进程启动后启动(非强制)
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Service]
EnvironmentFile=-/etc/default/ssh # 启动脚本的环境配置文件
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS # 实际执行此守护进程的命令或程序
ExecReload=/usr/sbin/sshd -t # systemctl reload 时的命令
ExecReload=/bin/kill -HUP $MAINPID # 同上,不过会替换上面的
KillMode=process # 终止进程的模式
Restart=on-failure # 自动重启条件
RestartPreventExitStatus=255
Type=notify # 守护进程启动方式
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target # 依附于哪个操作环境
Alias=sshd.service # 别名
多个单位用空格分开;等号左右不能有空格;等号后无内容表示空值。
ping
写为服务/etc/systemd/system/ping.service
内容:
[Unit]
Description=ping service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
ExecStart=/usr/bin/ping -i 10 192.168.1.100
[Install]
WantedBy=multi-user.target
ding@ding-server:~$ sudo systemctl start ping.service
ding@ding-server:~$ systemctl status ping.service
● ping.service - ping service
Loaded: loaded (/lib/systemd/system/ping.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2022-06-02 11:44:50 CST; 15s ago
Main PID: 2669998 (ping)
Tasks: 1 (limit: 19105)
Memory: 312.0K
CGroup: /system.slice/ping.service
└─2669998 /usr/bin/ping -i 10 192.168.1.100
Jun 02 11:44:50 hcm0153 systemd[1]: Started ping service.
Jun 02 11:44:50 hcm0153 ping[2669998]: PING 192.168.1.100 (192.168.1.100) 56(84) bytes of data.
Jun 02 11:44:50 hcm0153 ping[2669998]: 64 bytes from 192.168.1.100: icmp_seq=1 ttl=64 time=0.441 ms
Jun 02 11:45:00 hcm0153 ping[2669998]: 64 bytes from 192.168.1.100: icmp_seq=2 ttl=64 time=0.329 ms
在修改配置文件后,最好执行下面的语句:
sudo systemctl daemon-reload
journalctl
- 查看系统服务日志journalctl [选项]
选项:
-n 整数
:显示最近几行;如不填整数,为 10
-f
:滚动显示最新日志_PID=进程ID
:查看指定进程的日志_UID=用户ID
:查看指定用户的日志-u 单位名
:查看指定单位的日志-o 格式
:以给定格式输出(如 json-pretty
)--until
表时间的字符串:指定结束时间--no-pager
:改为标准输出,不分页输出-x
:显示更详细的解释信息-e
:直接跳到最后一页例:
service
可以做普通服务的启停、重启、重载、查看(实质上调用了 systemctl
):
service 不带扩展名的服务名 start|stop|restart|reload|status
除 status 外,其他均要求 root 权限。
chkconfig
CentOS 7.9 中仍然保留。
可以设置、查看(不带最后一个选项)服务的开机启动与否:
sudo chkconfig 不带扩展名的服务名 [on|off]
下面的命令只能查看 System V 形式的服务的启用信息:
ding@ding-server:~$ chkconfig --list
Note: This output shows SysV services only and does not include native systemd services. SysV configuration data might be overridden by native systemd configuration.
If you want to list systemd services use 'systemctl list-unit-files'. To see services enabled on particular target use 'systemctl list-dependencies [target]'.
jexec 0:off 1:on 2:on 3:on 4:on 5:on 6:off
netconsole 0:off 1:off 2:off 3:off 4:off 5:off 6:off
network 0:off 1:off 2:on 3:on 4:on 5:on 6:off
除 sync
外,通过 SSH 执行下面的命令均需要 root 权限;对普通用户,sync
只能同步自己的文件。
sync # 同步内存中的暂存文件到磁盘,建议关机前操作
reboot # 重启
halt # 停机,屏幕可能会显示停止的信息
poweroff # 关机
shutdown # 一分钟之后关机
shutdown -r # 重启
shutdown -h now # 立即关机
shutdown -h +10 # 10 min 后关机
shutdown -r 20:00 "提示信息" # 20:00 重启,按回车键后发送信息给其他终端
shutdown -c # 取消关机任务