跳转至

系统服务

约 1478 个字 102 行代码 8 张图片 预计阅读时间 6 分钟

Warning

系统服务的随意操作可能会带来无法预料的后果,请谨慎操作。

引入

需要长期运行的程序

比如服务器程序(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]
...

Linux 服务管理的变化

早期使用 System V init:

  • 内核第一个调用的程序是 init,由它启动其他的服务
  • 服务脚本放在 /etc/init.d/ 中,为 Shell 脚本,对服务的操作皆通过执行脚本实现
  • 服务通过 service 命令操作,是否开机启动通过 chkconfig 命令管理

现在的大部分发行版使用 systemd:

  • 出于兼容性考虑,功能上部分兼容 System V init,但不多
  • 具体信息见后

systemd 简介

systemd 架构图,作者 Shmuel Csaba Otto Traian (CC BY-SA 3.0):

systemd 架构图
systemd 架构图

配置文件

守护进程的执行脚本通称为服务单位(unit),每种服务单位根据功能区分时,分为不同类型。

存放目录(按优先级从高到低):

  1. /etc/systemd/system:管理员根据主机需求建立的服务脚本
  2. /run/systemd/system:系统执行过程中产生的服务脚本
  3. /usr/lib/systemd/system:每个服务最重要的启动脚本设置

服务单位类型的区分可看扩展名。

服务单位类型

  • service:一般服务
  • socket:套接字服务
  • target:操作环境
  • mount / automount:文件系统挂载相关服务
  • path:检测特定文件或目录
  • timer:循环执行的服务

通过 systemctl 管理服务

操作单个服务

systemctl 命令 服务名

命令:

  • 需要 root 权限
  • start:启动
  • stop:停止
  • restart:重启
  • reload:重新加载配置文件(不关闭)
  • enable:设置开机启动
  • disable:取消开机启动
  • mask:强制注销(防止被其他服务唤醒)
  • unmask:取消注销
  • 所有用户均可操作
  • status:查看状态
  • is-active:查看是否运行中
  • is-enable:查看是否开机启动

查看服务状态的例子

systemctl status 的例子
systemctl status 的例子

服务状态
  • 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 查看系统上所有服务 命令结构
systemctl 查看系统上所有服务 命令结构

systemctl list-units 示例

systemctl list-units 示例
systemctl list-units 示例

systemctl list-unit-files 示例

执行结果
执行结果

各列:

  1. 单位文件名称
  2. 服务默认状态
  3. 发行方预设?(CentOS 无此列)

操作环境(target unit)

简述

是一群单位的集合,执行操作环境就是执行这一群单位。

比较重要的环境:

  • graphical.target:命令加上图形界面(最常用)
  • multi-user.target:纯命令行模式
  • rescue.target:恢复模式
  • emergency.target:紧急恢复模式,紧急处理系统错误的模式
  • shutdown.target:关机模式
  • getty.target:限制 tty 数量的模式

systemctl 操作环境操作

systemctl 命令 
  • 所有用户均均可操作
  • get-default:获取当前环境
  • set-default 操作环境:设置默认操作环境为给定操作环境
  • 仅限 root 用户操作
  • 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
  • `--since 表时间的字符串:指定开始时间
  • --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 形式的服务的启用信息:

1
2
3
4
5
6
7
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 # 取消关机任务

拓展

参考资料