初识Systemd

前言

依Linux系统惯例,带字母d的一般为守护进程(daemon),Systemd即为System Daemon,是Linux下的一款系统和服务管理器,用于取代传统的Init组件。
Systemd功能强大,诸如Gnome桌面、用户登录管理、网络服务都已集成其中,甚至后续udev也要加入Systemd的"豪华套餐"。不过开源社区对于Systemd则是充满了争议:有人认为它有利于Linux系统标准化;有人则认为它管的太多——不符合UNIX
“keep simple, keep stupid"的设计哲学,总之是有褒有贬。而现在,越来越多的Linux发行版(如SUSE、RedHat、CentOS、Ububtu等)都开始使用Systemd,大势所趋,Systemd在争议之中竟有一统Linux发行版之势。
作为一个开发为主,顺便学学运维的小虾米,我接触Systemd的目的是为了实现一个脚本开机自启动的功能,至于其他的"是是非非”,自有肉食者谋,这里便不过多评价。

单元、服务与配置文件

Systemd由许多单元(Unit)组成,例如我们熟悉的SSH、Samba、Firewall等服务(Service),都由与之相关的Systemd单元进行管理。

Systemd单元有许多类型,不仅有管理服务的单元,还有管理其他系统资源的单元(如socket、系统设备、挂载点、文件系统等)。

要了解一个单元,最直观的方式就是查看它的配置文件,以SSH为例,在Systemd中由单元sshd.service管理,执行以下命令可以查看配置文件内容:

$ systemctl cat sshd.service

SSH配置文件:

[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service

[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
Type=simple
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

可以看到,配置文件分成几个区块,每个区块包含若干条字段组成的键值对,下面对解上述配置文件中几个关键字段的含义进行解释:

  • Description
    当前服务的简单描述
  • After
    启动顺序(与之对应还有Before),表示sshd.service在network.target与sshd-keygen.service之后启动
  • ExecStart
    启动命令,定义服务启动时执行的命令
  • ExecReload
    重载命令,定义服务重载时执行的命令
  • Type
    启动类型,下表列出了几种常见的类型
描述
simple 默认值, 表示启动的服务为主进程
oneshot 类似于simple,只执行一次,Systemd等待执行完毕后才启动其他服务
forking 以fork()方式启动,父进程退出,子进程成为主进程
  • WantedBy
    表示服务所在的Target

Target也是一种Systemd单元,可以理解为服务组,即一系列服务的集合

实现一个开机自启动服务

初步了解单元与配置文件后,我们就可以通过Systemd实现一个开机自启动的服务了。例如现有一个程序MyProgram位于目录/home下,欲使其开机自启动,步骤如下:
1. 新增自定义服务
在/usr/lib/systemd目录下新增配置文件MyProgram.service,如下:

[Unit]
Description=my program

[Service]
Type=oneshot
ExecStart=/home/MyProgram

[Install]
WantedBy=multi-user.target

2. 使能新增的服务
执行如下命令:

$ systemctl enable MyProgram.service

根据配置文件中字段WantedBy的值,该命令将在目录/etc/systemd/system/multi-user.target下创建文件MyProgram.service的软链接。
3. 查看运行状态
如此操作后,系统将在启动后执行程序MyProgram,执行如下命令查看服务的运行状态

$ systemctl status MyProgram.service

4. 去使能新增的服务
如果想取消开机启动MyProgram,则需执行以下命令:

$ systemctl disable MyProgram.service

参考:

  1. systemd (简体中文) - ArchWiki
  2. Systemd 入门教程 - 阮一峰的网络日志
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章