Systemctl
2022-11-25
参考链接:Systemd 入门教程:命令篇 - 阮一峰的网络日志 (ruanyifeng.com)
概述
Systemd 的诞生是为了解决 init 缺点;
init 缺点:
- 一是启动时间长。
init
进程是串行启动,只有前一个进程启动完,才会启动下一个进程。 - 二是启动脚本复杂。
init
进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。
Systemd 取代了initd
,成为系统的第一个进程(PID 等于 1),其他进程都是它的子进程。
Systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。事实上,现在还有很多人反对使用 Systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反"keep simple, keep stupid"的Unix 哲学。
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 配置为开机启动,并启动;