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 文件,当中能够加入或重置參数。这里设置的參数优先级高于原来的单元文件。

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

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

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

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

想知道为什么改动 ExecStart 前必须将其置空,參见 ([1]). 
下面是自己主动重新启动服务的一个样例:

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

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

  1.  
    # systemctl daemon-reload
  2.  
    # systemctl restart <单元>

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

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

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

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

安装 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 被创建。指向新的默认启动级别。

ubuntu18.04 systemctl的更多相关文章

  1. ubuntu-18.04 设置开机启动脚本-亲测有效

    ubuntu-18.04不能像ubuntu14一样通过编辑rc.local来设置开机启动脚本,通过下列简单设置后,可以使rc.local重新发挥作用. 2.将下列内容复制进rc-local.servi ...

  2. win10下安装ubuntu18.04

    在win10下安装Ubuntu18.04,双系统共存.Ubuntu 18.04 使用的是Gnome桌面. 查看系统的启动模式: Win+R打开运行,输入msinfo32,回车查看系统信息.在BIOS模 ...

  3. ubuntu18.04安装mysql

    ubuntu18.04中,默认情况下mysql默认包含在apt软件存储库中,要安装它只需要更新服务器上的包索引并安装默认包apt-get. 1.安装mysql sudo apt-get update ...

  4. ubuntu-18.04 设置开机启动脚本

    ubuntu-18.04 设置开机启动脚本 参阅下列链接 https://askubuntu.com/questions/886620/how-can-i-execute-command-on-sta ...

  5. Ubuntu18.04中安装cuda的记录

    一.参考: https://blog.csdn.net/QLULIBIN/article/details/78714596 https://www.jianshu.com/p/00c37b09f0f3 ...

  6. Ubuntu18.04上安装Docker CE

    建立 REPOSITORY 1.更新索引包 更新 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的地址,这样才能获取到最新的软件包 sudo ...

  7. Ubuntu18.04下搭建LAMP环境

    一.Apache2 web 服务器的安装 : 可以先更新一下服务器 1.sudo apt-get update             # 获取最新资源包 2.sudo apt-get upgrade ...

  8. 区块链Hyperledger Fabric 学习记录(一)开发环境搭建(ubuntu16.04/ubuntu18.04)

    目录 Fabric开发环境搭建 更新说明 教程环境及软件版本 Docker 安装Docker 配置用户组 配置Aliyun Docker加速器 安装docker-compose Go 下载源码 安装源 ...

  9. ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(一)

    ubuntu18.04配置nvidia docker和远程连接ssh+远程桌面连接(一) 本教程适用于想要在远程服务器上配置docker图形界面用于深度学习的用户. (一)ubuntu18.04配置n ...

随机推荐

  1. SpringBoot mysql出现The server time zone value '�й���׼ʱ��' is unrecogni

    MySql :8.0.18 引入的mysql驱动: SpringBoot整合Mybatis的框架,在访问Controller的时候 : ava.sql.SQLException: The server ...

  2. php文件包含漏洞 file inclusion vulnerability

    0x00 何为文件包含漏洞 开发人员如果在写类似include "a.php"的代码时,如果将a.php写成了可变的值,那么就可以在上面做文章,举个理想的例子: <? inc ...

  3. impdp时报错ORA-39083&ORA-01917

    转自:http://www.codes51.com/article/detail_146662.html impdp时报错ORA-39083&ORA-01917ORA-39083: 对象类型 ...

  4. C++ 语句函数再探

    1. 表达式只计算,抛弃计算结果: 2. 空语句什么也不做: 3.switch case语句漏写break,将会从匹配到的情况开始执行,直到语句结束 int main() { ; i + ; //表达 ...

  5. 后台向前台响应的json数据格式的一些问题

    最近在写后台向前台easyUI页面发送数据时遇到的一些报错. 首先easyUI内部封装了许多的方法和对象,以至于很多参数都不清楚,需要查询,其次easyUI也是有内置ajax所以从后台响应回来的数据一 ...

  6. Linux下文档与目录结构

    目录分类 Linux目录结构的组织形式和Windows有很大的不同.首先Linux没有“盘(C盘.D盘.E盘)”的概念.已经建立文件系统的硬盘分区被挂载到某一个目录下,用户通过操作目录来实现磁盘读写. ...

  7. ASP.Net模拟用户 System.Security.Principal

    一.概述 在实际的项目开发中,我们可能会需要调用一些非托管程序,而有些非托管程序需要有更高的身份权限才能正确执行.本文介绍了如何让IIS承载的ASP.NET网站以特定的账户执行,比如Administr ...

  8. 号外号外!WPF界面开发者福音,DevExpress支持.NET Core 3.0!

    通过DevExpress WPF Controls,你能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案. 无论是Office办公软件的衍 ...

  9. 设置 IntelliJ IDEA 主题

    一.选择File选项====>Settings====>Appearance====>Theme====>三选一切换主题

  10. C语言实现的文件交互

    计算机与外部设备的交互依靠文件完成 文件是记录在外部介质上的数据的集合:例如1.c 是源码 1.exe可执行的文件 文件的分类 按组织结构: 记录文件:有一定结构的文件,可以解析成字段值的文件: 流式 ...