systemctl入门

概念

Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器。

基本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#启动
systemctl start httpd
#停止
systemctl stop httpd
#重启
systemctl restart httpd
#查看所有服务
systemctl --type=service
#重载所有修改过的配置文件
systemctl daemon-reload

检查服务状态

服务执行时有可能出现失败等情况,这时需要查看服务状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ systemctl status httpd
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
Active: active (running) since 金 2014-12-05 12:18:22 JST; 7min ago
Main PID: 4349 (httpd)
Status: "Total requests: 1; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
├─4349 /usr/sbin/httpd -DFOREGROUND
├─4350 /usr/sbin/httpd -DFOREGROUND
├─4351 /usr/sbin/httpd -DFOREGROUND
├─4352 /usr/sbin/httpd -DFOREGROUND
├─4353 /usr/sbin/httpd -DFOREGROUND
└─4354 /usr/sbin/httpd -DFOREGROUND
1205 12:18:22 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
1205 12:18:22 localhost.localdomain systemd[1]: Started The Apache HTTP Server.
1205 12:22:40 localhost.localdomain systemd[1]: Started The Apache HTTP Server.

Loaded行:配置文件的位置,是否设为开机启动
Active行:表示正在运行
Main PID行:主进程ID
Status行:由应用本身(这里是 httpd )提供的软件当前状态
CGroup块:应用的所有子进程
日志块:应用的日志

将服务设置为开机启动

1
systemctl enable httpd

上面的命令相当于在/etc/systemd/system目录添加一个符号链接,指向/usr/lib/systemd/system里面的httpd.service文件。
这是因为开机时,Systemd只执行/etc/systemd/system目录里面的配置文件。这也意味着,如果把修改后的配置文件放在该目录,就可以达到覆盖原始配置的效果。

自定义服务

找到配置文件目录/usr/lib/systemd/system,我们打开sshd.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ systemctl cat sshd.service
[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

[Unit]区块

After: 表示ssh.servicenetwork.target sshd-keygen.service后启动
Wants: 表示与sshd-keygen.service存在弱依赖关系,如果sshd-keygen.service启动失败或异常退出,不影响sshd.service继续运行
Requires: 表示”强依赖”关系,即如果该服务启动失败或异常退出,那么sshd.service也必须退出。

After只表示执行顺序,不表示依赖
Want、Requires只表示依赖,不表示顺序,默认是同时执行

[Service]区块

启动命令

ExecReload字段:重启服务时执行的命令
ExecStop字段:停止服务时执行的命令
ExecStartPre字段:启动服务之前执行的命令
ExecStartPost字段:启动服务之后执行的命令
ExecStopPost字段:停止服务之后执行的命令

启动类型

通过Type字段指定启动类型

simple(默认值): systemd认为该服务将立即启动。服务进程不会 fork 。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket 激活型
forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便 systemd 能够跟踪服务的主进程。
oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
dbus:类似于simple,但会等待 D-Bus 信号后启动
notify:与 Type=simple相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
idle:systemd会等待所有任务处理完成后,才开始执行 idle 类型的单元。其他行为与 Type=simple 类似。

设定独立临时文件

PrivateTmp=true

[Install]区块

Install区块,定义如何安装这个配置文件,即怎样做到开机启动。

WantedBy字段:表示该服务所在的 Target。
Target的含义是服务组,表示一组服务。WantedBy=multi-user.target指的是,sshd 所在的 Target 是multi-user.target。

Systemd默认的target是multi-user.target

一般来说常用的target有两个

  • multi-user.target 表示多用户命令行状态
  • graphical.target表示图形用户状态,它依赖于multi-user.target

编写自定义服务

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=mongodb
[Service]
Type=forking
PIDFile=/var/run/mongodb/mongod.pid
ExecStart=/bin/mongod -f /etc/mongod.conf
ExecStop=/bin/pkill mongod
Type=forking # 对于后台daemon运行的程序使用forking类型启动
PrivateTmp=true
[Install]
WantedBy=multi-user.target

最后记得使用systemctl daemon-reload重载配置

环境变量

1
2
3
4
5
Environment="SECRET=pGNqduRFkB4K9C2vijOmUDa2kPtUhArN"
Environment="ANOTHER_SECRET=JP8YLOc2bsNlrGuD6LVTq7L36obpjzxd"
#使用变量
ExecStart=/bin/echo ${SECRET}

参考

systemd中文手册