翼度科技»论坛 云主机 服务器技术 查看内容

一文教你如何自定义systemd开机启动脚本

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
systemd简介

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

  • 启动管理:systemd 使用并行启动来提高系统启动速度,并支持启动任务的优先级和依赖关系设置。它可以同时处理服务、套接字和设备文件的启动。
  • 服务管理:systemd 通过提供单元文件(unit files)来管理系统服务。每个服务都有对应的配置文件,您可以在其中定义服务的属性、行为和依赖关系。同时,systemd 还提供了强大的日志记录、故障排除和错误报告机制。
  • 日志管理:systemd-journald 是 systemd 内置的日志管理器,负责收集、存储和检索系统日志信息。它支持结构化日志、日志转发和高性能查询功能。
  • 设备管理:systemd 可以监控和管理系统中的设备,包括磁盘驱动器、网络接口和输入设备等。它提供了 udev 规则来自动处理设备事件,例如插入或移除设备时触发相应操作。
  • 用户会话管理:systemd 提供了用户会话管理功能,它可以启动和监控用户会话,以及处理用户登录和注销过程。这对于支持多用户环境并提供长时间运行的会话非常有用。
  • 定时任务管理:systemd-timers 模块允许您定义和管理定时任务(类似于 crontab),可以精确地调度任务运行,并提供灵活的配置选项。
总体而言,systemd 提供了一个集成的、强大而灵活的系统管理框架,它改善了 Linux 系统的启动速度、进程管理、日志记录和设备管理等方面的性能和功能。因其广泛采用和丰富的功能,熟悉 systemd 对于 Linux 系统管理员和开发人员来说是非常重要的。

脚本存放位置


    1. /etc/systemd/system
    复制代码
    系统管理员安装的单元, 优先级更高


    1. /usr/lib/systemd/system
    复制代码
    :该目录中包含的是软件包安装的单元,也就是说通过 yum、dnf、rpm 等软件包管理命令管理的 systemd 单元文件,都放置在该目录下
    目录
    1. /lib/systemd/system
    复制代码
    以及
    1. /usr/lib/systemd/system
    复制代码
    其实指向的是同一目录


脚本简介

  1. /usr/lib/systemd/system
复制代码
下创建文件
  1. nginx.service
复制代码
,并赋予权限
  1. chmod +x nginx.service
复制代码
  1. [Unit]

  2. Description=nginx service
  3. # 要求必须执行网络
  4. Requires=network-online.target
  5. # 在网络启动之后启动
  6. After=network.target
  7. [Service]
  8. # 工作目录
  9. WorkingDirectory=/yourpath/infra/nginx
  10. Type=forking
  11. User=root
  12. # systemctl start nginx
  13. ExecStart=/yourpath/infra/nginx/sbin/nginx -c /yourpath/infra/nginx/conf/nginx.conf
  14. # systemctl start reload
  15. ExecReload=/yourpath/infra/nginx/sbin/nginx -s reload

  16. [Install]
  17. WantedBy=multi-user.target
复制代码

    1. [Unit]
    复制代码
    部分,您可以提供对服务的描述和定义其依赖关系。
    1. After=network.target
    复制代码
    表示该服务将在网络启动后启动。
    1. [Service]
    复制代码
    部分,指定要执行的脚本路径。请将
    1. /path/to/your/script.sh
    复制代码
    替换为您实际的脚本路径。
    1. [Install]
    复制代码
    部分用于指定启动级别。
    1. WantedBy=default.target
    复制代码
    表示该服务将随系统默认目标一起启动。
在 Systemd 中,
  1. Type
复制代码
是一个服务单元文件中的参数,它是用来指定服务类型的。一个服务可能有以下几种类型:
  1. <ul><li>[code]simple
复制代码
:服务主进程不会以守护进程方式运行,即服务进程在启动后会一直运行,并占据终端。当服务进程退出时,Systemd 认为服务已经停止运行。
    1. forking
    复制代码
    :服务主进程以守护进程方式运行。在启动服务后,服务主进程会将控制权交给子进程来执行实际的任务。此时,服务主进程会退出,但服务并没有结束。当子进程退出时,Systemd 认为服务已经停止运行。
    1. oneshot
    复制代码
    :服务主进程会被执行一次,然后退出。当服务主进程退出时,Systemd 认为服务已经停止运行。
    1. dbus
    复制代码
    :该类型的服务主要是以消息总线的方式提供服务,通常是由 D-Bus 库和 Systemd 搭配使用。
    1. notify
    复制代码
    :该类型的服务主要是通过向 Systemd 发送通知来表示服务已经启动完毕,例如在 MySQL 服务中,主进程在成功启动之后会向 Systemd 发送一个
    1. READY=1
    复制代码
    的通知。
    不同的服务类型会对应不同的逻辑,具体使用哪种类型取决于服务运行的特点和需求。[/code]
    执行脚本命令
    1. # 重新加载systemd
    2. systemdctl daemon-reload

    3. # 将 nginx.service 加入到开机启动
    4. systemctl enable nginx.service

    5. # 卸载 nginx.service
    6. systemctl disable nginx.service

    7. # 手动启动
    8. systemctl start nginx.service
    复制代码


    查看日志
    1. /var/log/messages
    复制代码
    :存放的是系统的日志信息,它记录了各种事件,基本上什么应用都能往里写日志,在做故障诊断时可以首先查看该文件内容
    方式一:
    1. journalctl -u nginx.service
    复制代码

    方式二:
    1. tail -f messages
    复制代码

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

    实战


    开机启动Elasticsearch
    1. elasticsearch.service
    复制代码
    1. /usr/lib/systemd/system
    复制代码
    下创建文件
    1. elasticsearch.service
    复制代码
    ,并赋予权限
    1. chmod +x elasticsearch.service
    复制代码
    1. [Unit]

    2. Description=elasticsearch service
    3. # 要求必须执行网络
    4. #Requires=network-online.target
    5. # 在网络启动之后启动
    6. After=network.target
    7. [Service]
    8. WorkingDirectory=/yourpath/infra/elasticsearch-7.17.4

    9. LimitNOFILE=100000
    10. LimitNPROC=100000

    11. Type=forking

    12. # 由于es不可以使用root启动,这里使用test用户
    13. User=test
    14. # 启动脚本
    15. ExecStart=/bin/sh /yourpath/infra/elasticsearch-7.17.4/start.sh

    16. #Restart=on-failure

    17. [Install]
    18. WantedBy=multi-user.target
    复制代码
    重点解释,
    1. LimitNOFILE
    复制代码
    1. LimitNPROC
    复制代码
    1. LimitNOFILE
    复制代码
    :
    1. [code]LimitNOFILE
    复制代码
    用于设置进程的文件描述符限制的参数。文件描述符是操作系统为进程分配的用于访问文件和其他输入/输出资源的标识符。每个进程都有一个限制,决定了它可以同时打开的文件数量。
    1. LimitNOFILE
    复制代码
    参数用于设置进程可以打开的文件描述符的最大数量。通过限制文件描述符的数量,可以控制进程对系统资源(如文件、套接字等)的使用情况。在启动脚本中设置
    1. LimitNOFILE
    复制代码
    的值可以影响到该进程及其子进程的文件描述符限制。例如,如果将
    1. LimitNOFILE
    复制代码
    设置为1000,则该进程及其子进程最多只能同时打开1000个文件
    。[/code]
    1. LimitNPROC
    复制代码
    :
    1. 每个进程在操作系统中都有一个相关的进程数,表示该进程所创建或派生的子进程数量。操作系统为每个用户和系统范围内的进程数都有一个上限限制。
    2. 通过使用[code]LimitNPROC
    复制代码
    参数,可以限制进程及其子进程可以同时存在的最大数量。一旦达到该限制,进程将无法创建更多的子进程。这有助于控制系统资源(如内存、处理器等)的使用情况,防止某个进程或用户占用过多的系统资源。在启动脚本中设置
    1. LimitNPROC
    复制代码
    的值可以影响到该进程及其子进程的并发进程数限制。例如,如果将
    1. LimitNPROC
    复制代码
    设置为100,则该进程及其子进程最多只能同时存在100个进程[/code]可以尝试不设置这两个参数,看看会发生什么问题
    启动
    1. Elasticsearch
    复制代码
    脚本
    1. #!/bin/sh
    2. su test
    3. /yourpath/infra/elasticsearch-7.17.4/bin/elasticsearch -d
    复制代码
    相关命令
    1. systemctl enable elasticsearch.service
    2. systemctl disable elasticsearch.service
    3. systemctl start elasticsearch.service
    4. ps -ef | grep elasticsearch
    复制代码
    开机启动springboot项目


    1. springboot.service
    复制代码


    1. /usr/lib/systemd/system
    复制代码
    下创建文件
    1. springboot.service
    复制代码
    ,并赋予权限
    1. chmod +x springboot.service
    复制代码
    1. [Unit]

    2. Description=springboot service
    3. # 要求必须执行网络
    4. #Requires=network-online.target
    5. # 在网络启动之后启动
    6. After=network.target
    7. [Service]
    8. WorkingDirectory=/yourpath/app/springboot

    9. Type=forking
    10. User=root
    11. # 启动前,等待10s
    12. ExecStartPre=/bin/sleep 10
    13. ExecStart=/bin/sh /yourpath/app/springboot/start.sh

    14. # 不输出日志
    15. StandardOutput=null
    16. StandardError=null

    17. [Install]
    18. WantedBy=multi-user.target
    复制代码
    解释:

      1. ExecStartPre
      复制代码
      :当启动
      1. springboot.service
      复制代码
      时,会先等待10s再启动,例如,项目依赖了mysql,而mysql启动需要时间。
      1. StandardOutput
      复制代码
      ,
      1. StandardError
      复制代码
      :配置了这两个为null,意思是springboot项目自身的日志,就不打印再
      1. /var/log/message
      复制代码
      中,因为springboot项目自身有日志管理
    启动springboot脚本
    1. #!/bin/sh
    2. /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 &
    复制代码
    我们在写脚本之时,最好都要写,完整的指令路径,不然经常会报找不到指令
    相关命令
    1. systemctl enable springboot.service
    2. systemctl disable springboot.service
    3. systemctl start springboot.service
    4. jps -l
    复制代码
    以上就是一文教你如何自定义systemd开机启动脚本的详细内容,更多关于自定义systemd开机脚本的资料请关注脚本之家其它相关文章!

    来源:https://www.jb51.net/server/291908q5m.htm
    免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
  • 本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    举报 回复 使用道具