声明:本文转载自:systemd (中文简体)

systemd 是 Linux 下的一款系统和服务管理器,兼容 SysV 和 LSB 的启动脚本。systemd 的特性有:支持并行化任务;同一时候採用 socket 式与 D-Bus 总线式激活服务;按需启动守护进程(daemon)。利用 Linux 的 cgroups 监视进程;支持快照和系统恢复。维护挂载点和自己主动挂载点。各服务间基于依赖关系进行精密控制。

检视和控制systemd的主要命令是systemctl。

该命令可用于查看系统状态和管理系统及服务。详见man 1 systemctl。

小贴士:

- 在 systemctl 參数中加入 -H <username>@<主机名> 能够实现对其它机器的远程控制。

该过程使用 SSH连接。

- systemadm 是 systemd 的官方图形前端。官方软件仓库 提供了稳定版本号 systemd-ui。

- Plasma 用户能够安装 systemctl 图形前端 systemd-kcm。

安装后能够在 System administration 下找到

基本工具

分析系统状态

显示 系统状态:

$ systemctl status

输出激活的单元:

$ systemctl

下面命令等效:

$ systemctl list-units

输出执行失败的单元:

$ systemctl --failed

全部可用的单元文件存放在 /usr/lib/systemd/system/ 和 /etc/systemd/system/ 文件夹(后者优先级更高)。

查看全部已安装服务:

$ systemctl list-unit-files

使用单元

一个单元配置文件能够描写叙述例如以下内容之中的一个:系统服务(.service)、挂载点(.mount)、sockets(.sockets) 、系统设备(.device)、交换分区(.swap)、文件路径(.path)、启动目标(.target)、由 systemd 管理的计时器(.timer)。

详情參阅 man 5 systemd.unit。

使用 systemctl 控制单元时,通常须要使用单元文件的全名,包括扩展名(比如 sshd.service)。可是有些单元能够在systemctl中使用简写方式。

  • 假设无扩展名,systemctl 默认把扩展名当作 .service。

    比如 netcfg 和 netcfg.service 是等价的。

  • 挂载点会自己主动转化为对应的 .mount 单元。比如 /home 等价于 home.mount。
  • 设备会自己主动转化为对应的 .device 单元,所以 /dev/sda2 等价于 dev-sda2.device。

Note: 有一些单元的名称包括一个 @ 标记。 (e.g. name@string.service): 这意味着它是模板单元 name@.service 的一个 实例。 string 被称作实例标识符, 在 systemctl 调用模板单元时,会将其当作一个參数传给模板单元。模板单元会使用这个传入的參数取代模板中的 %I 指示符。

在实例化之前。systemd 会先检查 name@string.suffix 文件是否存在(假设存在,应该就是直接使用这个文件。而不是模板实例化了)。

大多数情况下,包换 @ 标记都意味着这个文件是模板。假设一个模板单元没有实例化就调用,该调用会返回失败,由于模板单元中的 %I 指示符没有被替换。

Tip:

下面的大部分命令都能够跟多个单元名, 具体信息參见 man systemctl。

从systemd 220版本号開始, systemctl命令在enable、disable和mask子命令中添加了–now选项,能够实现激活的同一时候启动服务。取消激活的同一时候停止服务。

一个软件包可能会提供多个不同的单元。假设你已经安装了软件包,能够通过pacman -Qql package | grep systemd命令检查这个软件包提供了哪些单元。

马上激活单元:

# systemctl start <单元>

马上停止单元:

# systemctl stop <单元>

重新启动单元:

# systemctl restart <单元>

又一次载入配置:

# systemctl reload <单元>

输出单元执行状态:

$ systemctl status <单元>

检查单元是否配置为自己主动启动:

$ systemctl is-enabled <单元>

开机自己主动激活单元:

# systemctl enable <单元>

取消开机自己主动激活单元:

# systemctl disable <单元>

禁用一个单元(禁用后,间接启动也是不可能的):

# systemctl mask <单元>

取消禁用一个单元:

# systemctl unmask <单元>

显示单元的手冊页(必须由单元文件提供):

# systemctl help <单元>

又一次载入 systemd,扫描新的或有变动的单元:

# systemctl daemon-reload

电源管理

安装 polkit 后才干够一般用户身份使用电源管理。

假设你正登录在一个本地的systemd-logind用户会话。且当前没有其它活动的会话。那么下面命令无需root权限就可以执行。否则(比如。当前有还有一个用户登录在某个tty),systemd 将会自己主动请求输入rootpassword。

重新启动:

$ systemctl reboot

退出系统并停止电源:

$ systemctl poweroff

待机:

$ systemctl suspend

休眠:

$ systemctl hibernate

混合休眠模式(同一时候休眠到硬盘并待机):

$ systemctl hybrid-sleep

编写单元文件

systemd 单元文件的语法来源于 XDG桌面入口配置文件.desktop文件。最初的源头则是Microsoft Windows的.ini文件。

单元文件能够从两个地方载入。优先级从低到高各自是:

  • /usr/lib/systemd/system/: 软件包安装的单元
  • /etc/systemd/system/: 系统管理员安装的单元
  • 当systemd执行在用户模式下时,使用的载入路径是全然不同的。
  • systemd 单元名仅能包括 ASCII 字符, 下划线和点号. 其它字符须要用 C-style “\x2d” 替换. 參阅 man systemd.unit 和 man systemd-escape.}}

单元文件的语法,能够參考系统已经安装的单元,也能够參考man systemd.service中的EXAMPLES章节。

小贴士:

以 # 开头的凝视可能也能用在 unit-files 中, 可是仅仅能在新行中使用。 不要在 systemd 的參数后面使用行末凝视, 否则 unit 将会启动失败。

处理依赖关系

使用systemd时,可通过正确编写单元配置文件来解决其依赖关系。

典型的情况是,单元A要求单元B在A启动之前执行。在此情况下。向单元A配置文件里的 [Unit] 段加入 Requires=B 和 After=B 就可以。若此依赖关系是可选的,可加入 Wants=B 和 After=B。请注意 Wants= 和 Requires= 并不意味着 After=,即假设 After= 选项没有制定,这两个单元将被并行启动。

依赖关系通常被用在服务(service)而不是目标(target)上。比如, network.target 通常会被某个配置网络接口的服务引入,所以,将自己定义的单元排在该服务之后就可以,由于 network.target 已经启动。

服务类型

编写自己定义的 service 文件时,能够选择几种不同的服务启动方式。启动方式可通过配置文件 [Service] 段中的 Type= 參数进行设置。

  • Type=simple(默认值):systemd觉得该服务将马上启动。服务进程不会fork。

    假设该服务要启动其它服务,不要使用此类型启动。除非该服务是socket激活型。

  • Type=forking:systemd觉得当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求。使用此类型启动就可以。使用此启动类型应同一时候指定 PIDFile=,以便systemd能够跟踪服务的主进程。
  • Type=oneshot:这一选项适用于仅仅执行一项任务、随后马上退出的服务。可能须要同一时候设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然觉得服务处于激活状态。
  • Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。

    这一通知的实现由 libsystemd-daemon.so 提供。

  • Type=dbus:若以此方式启动。当指定的 BusName 出如今DBus系统总线上时。systemd觉得服务就绪。
  • Type=idle: systemd会等待全部任务处理完毕后。才開始执行idle类型的单元。

    其它行为和Type=simple 相似。

type的很多其它解释能够參考 systemd.service(5)

改动现存单元文件

为了避免和 pacman 冲突,不应该直接编辑软件包提供的文件. 要更改由软件包提供的单元文件,先创建名为 /etc/systemd/system/<单元名>.d/ 的文件夹(如 /etc/systemd/system/httpd.service.d/)。然后放入 *.conf 文件,当中能够加入或重置參数。这里设置的參数优先级高于原来的单元文件。

比如。假设想加入一个额外的依赖。创建这么一个文件就可以:

/etc/systemd/system/<unit>.d/customdependency.conf
[Unit]
Requires=<新依赖>
After=<新依赖>

As another example, in order to replace the ExecStart directive for a unit that is not of type oneshot, create the following file:

/etc/systemd/system/unit.d/customexec.conf
[Service]
ExecStart=
ExecStart=new command

想知道为什么改动 ExecStart 前必须将其置空,參见 ([1]).

下面是自己主动重新启动服务的一个样例:

/etc/systemd/system/unit.d/restart.conf
[Service]
Restart=always
RestartSec=30

然后执行下面命令使更改生效:

# systemctl daemon-reload
# systemctl restart <单元>

此外,把旧的单元文件从 /usr/lib/systemd/system/ 拷贝到 /etc/systemd/system/,然后进行改动,也能够达到相同效果。

在 /etc/systemd/system/ 文件夹中的单元文件的优先级总是高于 /usr/lib/systemd/system/ 文件夹中的同名单元文件。注意,当 /usr/lib/ 中的单元文件因软件包升级变更时,/etc/ 中自己定义的单元文件不会同步更新。此外,你还得执行 systemctl reenable 。手动又一次启用该单元。因此。建议使用前面一种利用 *.conf 的方法。

小贴士: 用 systemd-delta 命令来查看哪些单元文件被覆盖、哪些被改动。

系统维护的时候须要及时了解哪些单元已经有了更新。

安装

name=vim-systemd">vim-systemd 软件包,能够使 unit 配置文件在 Vim 下支持语法高亮。

目标(target)

启动级别(runlevel)是一个旧的概念。

如今,systemd 引入了一个和启动级别功能相似又不同的概念——目标(target)。不像数字表示的启动级别,每一个目标都有名字和独特的功能,而且能同一时候启用多个。一些目标继承其它目标的服务,并启动新服务。

systemd 提供了一些模仿 sysvinit 启动级别的目标。仍能够使用旧的 telinit 启动级别 命令切换。

获取当前目标

不要使用 runlevel 命令了:

$ systemctl list-units --type=target

创建新目标

在 Fedora 中,启动级别 0、1、3、5、6 都被赋予特定用途。而且都对应一个 systemd 的目标。然而,没有什么非常好的移植用户定义的启动级别(2、4)的方法。要实现相似功能,能够以原有的启动级别为基础。创建一个新的目标 /etc/systemd/system/<新目标>(能够參考 /usr/lib/systemd/system/graphical.target),创建 /etc/systemd/system/<新目标>.wants 文件夹,向当中加入额外服务的链接(指向 /usr/lib/systemd/system/ 中的单元文件)。

目标表

SysV 启动级别 Systemd 目标 凝视
0 runlevel0.target, poweroff.target 中断系统(halt)
1, s, single runlevel1.target, rescue.target 单用户模式
2, 4 runlevel2.target, runlevel4.target, multi-user.target 用户自己定义启动级别。通常识别为级别3。
3 runlevel3.target, multi-user.target 多用户,无图形界面。用户能够通过终端或网络登录。
5 runlevel5.target, graphical.target 多用户。图形界面。继承级别3的服务。并启动图形界面服务。
6 runlevel6.target, reboot.target 重新启动
emergency emergency.target 急救模式(Emergency shell)

切换启动级别/目标

systemd 中。启动级别通过“目标单元”訪问。通过例如以下命令切换:

# systemctl isolate graphical.target

该命令对下次启动无影响。

等价于telinit 3 或 telinit 5。

改动默认启动级别/目标

开机启动进的目标是 default.target。默认链接到 graphical.target (大致相当于原来的启动级别5)。

能够通过内核參数更改默认启动级别:

  • systemd.unit=multi-user.target (大致相当于级别3)
  • systemd.unit=rescue.target (大致相当于级别1)

还有一个方法是改动 default.target。能够通过 systemctl 改动它:

# systemctl set-default multi-user.target

要覆盖已经设置的default.target。请使用 force:

# systemctl set-default -f multi-user.target

能够在 systemctl 的输出中看到命令执行的效果:链接 /etc/systemd/system/default.target 被创建。指向新的默认启动级别。

systemctl介绍的更多相关文章

  1. 手动编译安装Libvirt之后利用systemctl管理libvirtd服务

    因为要给特殊的虚拟机关联文件指定selinux标签,而默认的Libvirt没有这个功能,所以需要修改LIbvirt源代码,重新编译安装Libvirt,而手动编译安装的LIbvirt,没有办法使用sys ...

  2. CentOS7 利用systemctl添加自定义系统服务

    一.命令systemctl介绍 CentOS 7.0中已经没有service命令,而是启用了systemctl服务器命令,它实际上将 service 和 chkconfig 这两个命令组合到一起. 命 ...

  3. CentOS7系统服务管理systemctl

    目录 一.systemctl介绍 二.systemctl常用命令 1.启动服务 2.停止服务 3.重启服务 4.查看服务是否已启动 5.查看服务的状态 6.启用开机自启动服务 7.停用开机自启动服务 ...

  4. Linux 之CentOS7使用firewalld打开关闭防火墙与端口

    一.firewalld的基本使用 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status f ...

  5. Linux中systemctl命令详细介绍

    Linux Systemctl是一个系统管理守护进程.工具和库的集合,用于取代System V.service和chkconfig命令,初始进程主要负责控制systemd系统和服务管理器.通过Syst ...

  6. Linux Systemd 详细介绍: Unit、Unit File、Systemctl、Target

    Systemd 简介 CentOS 7 使用 Systemd 替换了SysV Ubuntu 从 15.04 开始使用 Systemd Systemd 是 Linux 系统工具,用来启动守护进程,已成为 ...

  7. supervisor的安装与简单介绍

    1,介绍 Supervisor是一个进程管理工具,官方的说法 用途就是有一个进程需要每时每刻不断的跑,但是这个进程又有可能由于各种原因有可能中断.当进程中断的时候我希望能自动重新启动它,此时,我就需要 ...

  8. Saltstack 介绍、安装、配置(一)

    Slatstack 介绍 官网:https://saltstack.com/ 官方源:http://repo.saltstack.com/  (介绍各操作系统安装方法) http://repo.sal ...

  9. 在CentOS7上使用systemctl配置tomcat

    最近买了一台阿里云,现在阿里云CentOS都已经支持7了(前面都是使用CentOS6),索性直接使用CentOS7,7上面目前最大区别就是service变成了现在的systemctl,简单的查了一下并 ...

随机推荐

  1. linux下依赖库的版本问题引起的安装失败:libssl-dev版本问题无法安装 :libssl-dev : 依赖: libssl1.0.0 (= 1.0.1-4ubuntu3) 但是 1.0.1-4ubuntu5.31 正要被安装

    依赖库版本问题引起的安装失败解决方法如下有两种: 1.是由于源需要更新,如下操作: libssl-dev : 依赖: libssl0.9.8 (= 0.9.8o-1ubuntu4) 但是 0.9.8o ...

  2. WAS生成的文件:javacore.***.txt 、heapdump.***.phd、core.***.dmp、Snap.***.trc

    WAS生成的常见文件有哪些? 原文链接:http://blog.csdn.net/pqh20085101092/article/details/39370389 javacore.***.txt : ...

  3. IE11不能使用F12功能DOM资源管理器无法使用

    https://www.ludou.org/win7-ie-11-f12-bug.html 32位win7下载补丁:http://www.microsoft.com/zh-CN/download/de ...

  4. [CNN] Understanding Convolution

    From: http://blog.csdn.net/zouxy09/article/details/49080029 一个概念需经过反复的推敲以及时间的沉淀,之后才能真正理解 [OpenCV] Im ...

  5. [JS] Topic - define "class" by tricky methods

    Ref:Javascript定义类(class)的三种方法 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(O ...

  6. Ubuntu14.04下安装redis-3.2.0以及开机自启动

    去官网下载Redis-3.2.0.tar.gz,将redis-3.2.0.tar.gz放入/opt目录下 解压redis-3.2.0.tar.gz xiaoyao@xiaoyao-virtual-ma ...

  7. Linux input子系统编程、分析与模板

    输入设备都有共性:中断驱动+字符IO,基于分层的思想,Linux内核将这些设备的公有的部分提取出来,基于cdev提供接口,设计了输入子系统,所有使用输入子系统构建的设备都使用主设备号13,同时输入子系 ...

  8. Cannot change version of project facet Dynamic Web Module to 3.0 异常问题处理

    如何解决Tomcat服务器在初始化应用的时候的以下异常问题 1,Cannot change version of project facet Dynamic Web Module to 3.0 2,O ...

  9. 10.24CRM完成

    2018-10-24 16:16:59 已经完成了crm项目: 项目做完了,这几天可以安静整理Django啦!!!把博客整理一下! 然后再过几天针就可以回学校啦!! 今天程序员节  节日快乐!hell ...

  10. AngularJS基础01 从HelloWorld说起

    作者:arccosxy  转载请注明出处:http://www.cnblogs.com/arccosxy/ 准备工作 首先,创建一个名为index.html的HTML文件,代码如下: <!DOC ...