前言
依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