Systemctl

参考链接:Systemd 入门教程:命令篇 - 阮一峰的网络日志 (ruanyifeng.com)

概述

Systemd 的诞生是为了解决 init 缺点;

init 缺点:

  • 一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
  • 二是启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。

Systemd 取代了initd,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。

Systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。事实上,现在还有很多人反对使用 Systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反"keep simple, keep stupid"的Unix 哲学

img

Type 参数

这个Type参数作用是用来标志systemctl是否要跟踪处理服务进程是否启动成功,如果是forking则是需要跟踪对应的MAINPID是否存在,只有检测到MAINPID存在才能确定这个服务启动成功。这就需要保证被启动的那个服务能够按照标准协议来把pid写入对应文件或是进行对应处理。如果是simple或是不填,则systemctl认为这是一般的应用程序,只要启动就能保证成功,而不会去检查对应的服务是否真的执行成功。

这也就解释了两个现象:

要想把type设置成forking,需要在mongodb的启动选项上使用–fork,又由于有fork则必须带上–logpath
为什么设置成forking之后要等一会才能运行完sytemctl start指令,因为它要检查是否成功,而simple则一闪而过。
另附type的取值

Type:定义启动时的进程行为。它有以下几种值。

Type=simple:默认值,执行ExecStart指定的命令,启动主进程

Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出

Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行

Type=dbus:当前服务通过D-Bus启动

Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行

Type=idle:若有其他任务执行完毕,当前服务才会运行

Mongoldb 配置systemctl

# forking 方式
[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/dev/usr/mongodb/bin/mongod --dbpath /dev/usr/mongodb/data --fork --logpath /var/log/mongodb/mongod.log
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/dev/usr/mongodb/bin/mongod --shutdown --dbpath /dev/usr/mongodb/data
PrivateTmp=true
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target


##############################
##############################
# simple或不填 方式
[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target

[Service]
#Type=forking
ExecStart=/dev/usr/mongodb/bin/mongod --dbpath /dev/usr/mongodb/data
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/dev/usr/mongodb/bin/mongod --shutdown --dbpath /dev/usr/mongodb/data
PrivateTmp=true
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

systemctl enable keepalived --now

将 keepalived 配置为开机启动,并启动;