systemd简介

systemd 是一个系统守护进程(init 系统),用于管理 Linux 操作系统的启动、运行和关闭过程。它被广泛采用作为 Linux 发行版的默认 init 系统,如 Ubuntu、Fedora 和 CentOS。

以下是 systemd 的一些关键特点和功能:

总体而言,systemd 提供了一个集成的、强大而灵活的系统管理框架,它改善了 Linux 系统的启动速度、进程管理、日志记录和设备管理等方面的性能和功能。因其广泛采用和丰富的功能,熟悉 systemd 对于 Linux 系统管理员和开发人员来说是非常重要的。

脚本存放位置

脚本简介

/usr/lib/systemd/system下创建文件nginx.service,并赋予权限chmod +x nginx.service

[Unit]
​
Description=nginx service
# 要求必须执行网络
Requires=network-online.target
# 在网络启动之后启动
After=network.target
[Service]
# 工作目录
WorkingDirectory=/yourpath/infra/nginx
Type=forking
User=root
# systemctl start nginx
ExecStart=/yourpath/infra/nginx/sbin/nginx -c /yourpath/infra/nginx/conf/nginx.conf
# systemctl start reload
ExecReload=/yourpath/infra/nginx/sbin/nginx -s reload
​
[Install]
WantedBy=multi-user.target
​

在 Systemd 中,Type 是一个服务单元文件中的参数,它是用来指定服务类型的。一个服务可能有以下几种类型:

  • simple:服务主进程不会以守护进程方式运行,即服务进程在启动后会一直运行,并占据终端。当服务进程退出时,Systemd 认为服务已经停止运行。
  • forking:服务主进程以守护进程方式运行。在启动服务后,服务主进程会将控制权交给子进程来执行实际的任务。此时,服务主进程会退出,但服务并没有结束。当子进程退出时,Systemd 认为服务已经停止运行。
  • oneshot:服务主进程会被执行一次,然后退出。当服务主进程退出时,Systemd 认为服务已经停止运行。
  • dbus:该类型的服务主要是以消息总线的方式提供服务,通常是由 D-Bus 库和 Systemd 搭配使用。
  • notify:该类型的服务主要是通过向 Systemd 发送通知来表示服务已经启动完毕,例如在 MySQL 服务中,主进程在成功启动之后会向 Systemd 发送一个 READY=1 的通知。

不同的服务类型会对应不同的逻辑,具体使用哪种类型取决于服务运行的特点和需求。

执行脚本命令

# 重新加载systemd
systemdctl daemon-reload
​
# 将 nginx.service 加入到开机启动
systemctl enable nginx.service
​
# 卸载 nginx.service
systemctl disable nginx.service
​
# 手动启动
systemctl start nginx.service

查看日志

/var/log/messages:存放的是系统的日志信息,它记录了各种事件,基本上什么应用都能往里写日志,在做故障诊断时可以首先查看该文件内容

方式一:

journalctl -u nginx.service

方式二:

tail -f messages

至此,如果使用命令能够启动成功,一般开机也会自启动,无需手动执行

实战

开机启动Elasticsearch

elasticsearch.service

/usr/lib/systemd/system下创建文件elasticsearch.service,并赋予权限chmod +x elasticsearch.service

[Unit]
​
Description=elasticsearch service
# 要求必须执行网络
#Requires=network-online.target
# 在网络启动之后启动
After=network.target
[Service]
WorkingDirectory=/yourpath/infra/elasticsearch-7.17.4
​
LimitNOFILE=100000
LimitNPROC=100000
​
Type=forking
​
# 由于es不可以使用root启动,这里使用test用户
User=test
# 启动脚本
ExecStart=/bin/sh /yourpath/infra/elasticsearch-7.17.4/start.sh
​
#Restart=on-failure
​
[Install]
WantedBy=multi-user.target
​

重点解释,LimitNOFILELimitNPROC

LimitNOFILE:

LimitNOFILE用于设置进程的文件描述符限制的参数

文件描述符是操作系统为进程分配的用于访问文件和其他输入/输出资源的标识符。每个进程都有一个限制,决定了它可以同时打开的文件数量。

LimitNOFILE参数用于设置进程可以打开的文件描述符的最大数量。通过限制文件描述符的数量,可以控制进程对系统资源(如文件、套接字等)的使用情况。

在启动脚本中设置LimitNOFILE的值可以影响到该进程及其子进程的文件描述符限制。例如,如果将LimitNOFILE设置为1000,则该进程及其子进程最多只能同时打开1000个文件

LimitNPROC:

每个进程在操作系统中都有一个相关的进程数,表示该进程所创建或派生的子进程数量。操作系统为每个用户和系统范围内的进程数都有一个上限限制。

通过使用LimitNPROC参数,可以限制进程及其子进程可以同时存在的最大数量。一旦达到该限制,进程将无法创建更多的子进程。这有助于控制系统资源(如内存、处理器等)的使用情况,防止某个进程或用户占用过多的系统资源。

在启动脚本中设置LimitNPROC的值可以影响到该进程及其子进程的并发进程数限制。例如,如果将LimitNPROC设置为100,则该进程及其子进程最多只能同时存在100个进程

可以尝试不设置这两个参数,看看会发生什么问题

启动Elasticsearch脚本

#!/bin/sh
su test
/yourpath/infra/elasticsearch-7.17.4/bin/elasticsearch -d

相关命令

systemctl enable elasticsearch.service
systemctl disable elasticsearch.service
systemctl start elasticsearch.service
ps -ef | grep elasticsearch

开机启动springboot项目

springboot.service

/usr/lib/systemd/system下创建文件springboot.service,并赋予权限chmod +x springboot.service

[Unit]
​
Description=springboot service
# 要求必须执行网络
#Requires=network-online.target
# 在网络启动之后启动
After=network.target
[Service]
WorkingDirectory=/yourpath/app/springboot
​
Type=forking
User=root
# 启动前,等待10s
ExecStartPre=/bin/sleep 10
ExecStart=/bin/sh /yourpath/app/springboot/start.sh
​
# 不输出日志
StandardOutput=null
StandardError=null
​
[Install]
WantedBy=multi-user.target
​

解释:

启动springboot脚本

#!/bin/sh
/bin/nohup /youpath/infra/jdk1.8.0_341/bin/java -jar /lbpdata/app/springboot/bootstrap-1.0.0.jar --server.servlet.context-path=/test --spring.config.location=application-test.yml >/dev/null 2>&1 &

我们在写脚本之时,最好都要写,完整的指令路径,不然经常会报找不到指令

相关命令

systemctl enable springboot.service
systemctl disable springboot.service
systemctl start springboot.service
jps -l

以上就是一文教你如何自定义systemd开机启动脚本的详细内容,更多关于自定义systemd开机脚本的资料请关注本站其它相关文章!

发表回复