苏木川のBlog

Linux服务管理命令service与systemctl

2021/07/24

历史背景

Linux 系统服务有时也称为守护程序,是在Linux启动时自动加载并在Linux退出时自动停止的系统任务。历史版本中的linux对服务的操作是通过service来完成的。若创建用户自定义的服务,则需要较为复杂的操作。目前linux新的发行版已经内置了systemctl来操作服务。

在早期服务管理中,Init 是Linux系统启动时创建的第一个进程。它是一个守护进程,会一直运行到系统关闭。init 是其他所有进程的直接或间接祖先,并自动监护所有孤儿进程。内核按照硬编码的文件名启动它,如果内核不能启动它,将会导致内核崩溃。init 的进程标识符(PID)通常是 1。在系统启动和关闭时,init 进程会启动 init 脚本(或称 rc)来保障基本功能。这包括挂载和卸载文件系统,以及启动守护进程。进一步,有一个服务管理器提供对已启动进程的主动控制,称为进程监控。例如监测崩溃的进程并适时重启。这些元素加起来就成了 init 系统。某些 init 将服务管理器包含在 init 进程中,或是有紧密联系的 init 脚本。在下面,这类 init 将被称为整合式的。其他的分类下的条目可能会相互依赖。

目前,很多Linux发行版转向了systemd。systemd 是一个 Linux 系统基础组件的集合,提供了一个系统和服务管理器,运行为 PID 1 并负责启动其它程序。功能包括:支持并行化任务;同时采用 socket 式与 D-Bus 总线式激活服务;按需启动守护进程(daemon);利用 Linux 的 cgroups (简体中文) 监视进程;支持快照和系统恢复;维护挂载点和自动挂载点;各服务间基于依赖关系进行精密控制。systemd 支持 SysV 和 LSB 初始脚本,可以替代 sysvinit。除此之外,功能还包括日志进程、控制基础系统配置,维护登陆用户列表以及系统账户、运行时目录和设置,可以运行容器和虚拟机,可以简单的管理网络配置、网络时间同步、日志转发和名称解析等。

Init系统是一系列简单精小服务构成的集合,配置起来很复杂,但是配置过程透明。而systemd则是一个包含很多功能的庞大系统,配置简单,对于这个转换,各方争论不一,有人喜欢它的功能强大,操作简单,有人批评它不符合Unix哲学。

service命令

service是Init系统下进行服务管理的命令,service命令本身是一个shell脚本,它在/etc/init.d/目录查找指定的服务脚本,然后调用该服务脚本来完成任务。
Service

可通过sercice SCRIPT COMMAND命令管理服务,SCRIPT为/etc/init.d/中存放的可执行脚本文件:

1
2
3
4
service SCRIPT start    #启动服务
service SCRIPT stop #停止服务
service SCRIPT restart #重启服务
service SCRIPT status #查看状态服务

此外还可以用service --status-all显示出所有系统服务列表,其中”+”代表服务正在运行,而”-“代表服务处于关闭状态,”?”代表根本没有状态这一说。
查看运行服务还可以用 ps aux | grep service_name查看进程情况;如果是网络服务,还可以查看端口的监听情况,执行 netstat -tuln | grep service_name/port_number,例如可以执行 netstat -tuln | grep ftp查看端口状态,默认端口为21。
用户可以添加自定义服务,将相应脚本放置于/etc/init.d/文件夹下。

systemctl命令

服务管理

systemctl是systemd系统下的服务管理命令。它包含的功能很多,详见systemctl

1
2
3
4
5
6
7
systemctl status   #显示系统状态
systemctl start [单元] #立即激活单元:
systemctl stop [单元] #立即停止单元
systemctl restart [单元] #重启单元
systemctl enable [单元] #开机自动激活单元
systemctl disable [单元] #取消开机自动激活单元
systemctl daemon-reload #重新载入systemd,扫描新的或有变动的单元

Systemd使用“单元(Unit)”监控管理系统,单元文件是 ini 风格的纯文本文件。 封装了有关下列对象的信息: 服务(service)、套接字(socket)、设备(device)、挂载点(mount)、自动挂载点(automount)、 启动目标(target)、交换分区或交换文件(swap)、被监视的路径(path)、任务计划(timer)、 资源控制组(slice)、一组外部创建的进程(scope)。有关单元详细介绍参见systemd.unit 中文手册

能用systemctl管理的服务需要有一个.service文件,在Ubuntu中,通常该文件位于/etc/systemd/system文件夹下,有关Systemd服务单元参见systemd.service 中文手册
在这里插入图片描述
当你更改了相关服务配置文件后,需要运行以下命令重启服务:

1
2
sudo systemctl daemon-reload && sudo systemctl restart name
# 其中name为你要重启的服务

systemd 目标

Systemd中目标的概念,systemd 目标由目标单元表示。目标单元文件以 .target 文件扩展名结尾,它们的唯一用途是通过依赖项链将其他 systemd 单元分组在一起。例如,用于启动图形会话的 graphical.target 单元 将启动系统服务,如 GNOME 显示管理器 (gdm.service) 或帐户服务 (accounts-daemon.service),还激活 multi-user.target 单元。同样,multi-user.target 单元会启动其他基本系统服务,如 NetworkManager (NetworkManager.service)或 D-Bus (dbus.service),并激活另一个名为 basic.target 的目标单元。该模式替代了SysV init中预定义的运行级别。

SysV 运行级别与 systemd 目标的比较

运行级别 目标单元 描述
0 runlevel0.target, poweroff.target 关闭系统
1 runlevel1.target, rescue.target 设置救援 shell
2 runlevel2.target, multi-user.target 设置一个非图形化的多用户系统
3 runlevel3.target, multi-user.target 设置一个非图形化的多用户系统
4 runlevel4.target, multi-user.target 设置一个非图形化的多用户系统
5 runlevel5.target, graphical.target 设置图形化多用户系统
6 runlevel6.target, reboot.target 关闭并重启系统

命令:

1
2
3
4
5
6
7
# sysvinit 运行级别
runlevel #查看当前运行级别
init N #进入其它运行级别

# systemd 目标
systemctl list-units --type=target #列出了当前加载的和激活的目标
systemctl isolate graphical.target #切换目标

日志功能

此外,systemd提供了日志功能,查看日志是我们寻找问题的重要方法。journalctl 用来查询 systemd-journald 服务收集到的日志。systemd-journald 服务是 systemd init 系统提供的收集系统日志的服务`

日志功能常用命令如下:

1
2
3
4
journalctl            #不带任何选项时,默认输出所有的日志记录
journalctl -n [num] #显示最后num行的日志,如果省略num,则默认显示最后10行
journalctl -f #实时滚动显示最新日志
journalctl -u [unit] #显示指定unit的日志

查看日志需要超级管理员权限。

1
2
3
4
# 具体用法参见
journalctl -h
# 例如查看docker服务最新日志
sudo journalctl -u docker | tail -n 50

参考文献

systemd (简体中文)
使用 systemd 目标
linux journalctl 命令

CATALOG
  1. 1. 历史背景
  2. 2. service命令
  3. 3. systemctl命令
    1. 3.1. 服务管理
    2. 3.2. systemd 目标
    3. 3.3. 日志功能
  4. 4. 参考文献