Linux 系统中注册服务的几种方式

Linux 系统中注册服务的方式

准备环境

  • CentOs 8

  • linux服务器中安装Java 8

  • 准备可执行springboot 程序演示
    我准备了一个非常简单的springboot应用启动后访问8080端口返回一个简单页面。
    在这里插入图片描述
    将打包的springboot 应用上传到服务器 /soft目录
    在这里插入图片描述

  • 编写一段Shell脚本 控制应用启动|关闭|查看状态

    vim /soft/myBoot.sh
    内容如下

    #!/bin/bash
    
    # 程序路径
    JAR_PATH="/soft"
    # 服务名称
    SERVICE_NAME="springboot-demo-0.0.1-SNAPSHOT.jar"
    # 输出日志文件
    LOG_FILE="/soft/application.log"
    
    # 启动函数
    start() {
    	# 启动前先停止以防止有已启动情况
    	stop
        echo "Starting $SERVICE_NAME..."
        # 这里编写启动逻辑
        java -jar "$JAR_PATH/$SERVICE_NAME" > $LOG_FILE 2>&1
        echo "view Log In File $LOG_FILE"
    }
    
    # 停止函数
    stop() {
        echo "Stopping $SERVICE_NAME..."
        # 这里编写停止逻辑
        pid=$(ps aux | grep '[s]pringboot-demo-0.0.1-SNAPSHOT.jar' | awk '{print $2}')
            if [ -n "$pid" ]; then
                echo "$SERVICE_NAME pid is $pid"
                kill "$pid"
            fi
    }
    
    # 重启函数
    restart() {
        stop
        start
    }
    
    # $1 表示命令行第一个参数
    case "$1" in
        start)
            start
            ;;
        stop)
            stop
            ;;
        restart)
            restart
            ;;
        *)
            echo "Usage: $0 {start|stop|restart}"
            exit 1
            ;;
    esac
    
  • 给脚本添加执行权限

    [root@iZbp1cv33h9zpl0s5k5hwuZ soft]# chmod +x /soft/myBoot.sh
    

一、systemd 方式注册服务 (推荐方式)

  1. 创建systemd服务单元配置文件
    这个文件是用来描述如何启动、管理和监控你的程序的服务单元.

    # 创建单元服务文件
    touch /usr/lib/systemd/system/myBoot.service 
    
  2. 编写服务单元配置文件

    # 单元服务配置规则
    [Unit]
    Description=xxx          # 描述你的文件是干什么的
    After=network.target 	 #这个代表网络服务启动完毕后,再启动程序
                             # 可根据需要添加依赖的服务,例如:After=mysqld.service xxx xx2 多的用空格隔开
    [Service]
    ExecStart=/path/to/img1.2  # 替换为你的二进制文件的实际路径 也可以是脚本文件.sh
    Restart=on-failure          # 如果程序崩溃则自动重启
    RestartSec=5                # 重启间隔时间
    User=<username>            # 运行此服务的用户,默认可以是root,也可以指定其他非特权用户 可 			  以不填
    Group=<groupname>           # 运行此服务的组,默认与User相同 可以不填
    Type=simple                 # 对于大多数二进制文件来说,Type=simple即可 及跑一次一直运行
    # 根据程序需求,可能需要环境变量设置,如:
    Environment="VAR_NAME=value"  #无要求可删
    [Install]
    WantedBy=default.target      # 表示随系统启动时加载该服务
    
    

    根据以上规则编写我们的单元服务配置

    vim /usr/lib/systemd/system/myBoot.service

    写入以下内容保存

    [Unit]
    #服务描述
    Description=myBoot XX系统
    #依赖服务 该服务应该在哪些服务之后启动。
    After=network.target
    
    [Service]
    # 设置 systemctl start myBoot.service 执行命令
    ExecStart=/soft/myBoot.sh start
    # 设置 systemctl stop myBoot.service 执行命令
    ExecStop=/soft/myBoot.sh stop
    # 设置 systemctl reload myBoot.service 执行命令
    ExecReload=/soft/myBoot.sh restart
    # 重启
    Restart=on-failure
    RestartSec=10
    Type=simple
    
    
    [Install]
    WantedBy=default.target
    
  3. 给单元服务文件添加权限

    chmod 777  /usr/lib/systemd/system/myBoot.service
    
  4. 加载单元服务文件

    systemctl daemon-reload
    
  5. 启动服务

    # 启动服务  .service 可写可不写
    systemctl start  myBoot
    
    # 查看运行状态  active (running) 表示运行中
    [root@iZbp1cv33h9zpl0s5k5hwuZ soft]# systemctl status  myBoot
    ● myBoot.service - myBoot XX系统
       Loaded: loaded (/usr/lib/systemd/system/myBoot.service; disabled; vendor preset: disabled)
       Active: active (running) since Thu 2024-06-06 22:59:53 CST; 59s ago
     Main PID: 2902 (myBoot.sh)
        Tasks: 28 (limit: 11426)
       Memory: 220.6M
       CGroup: /system.slice/myBoot.service
               ├─2902 /bin/bash /soft/myBoot.sh start
               └─2907 java -jar /soft/springboot-demo-0.0.1-SNAPSHOT.jar
    
    Jun 06 22:59:53 iZbp1cv33h9zpl0s5k5hwuZ systemd[1]: Started myBoot XX系统.
    Jun 06 22:59:53 iZbp1cv33h9zpl0s5k5hwuZ myBoot.sh[2902]: Stopping springboot-demo-0.0.1-SNAPSHOT.jar...
    Jun 06 22:59:53 iZbp1cv33h9zpl0s5k5hwuZ myBoot.sh[2902]: Starting springboot-demo-0.0.1-SNAPSHOT.jar...
    [root@iZbp1cv33h9zpl0s5k5hwuZ soft]# 
    
    #验证启动状态
    #我们访问这个springboot应用的接口
    [root@iZbp1cv33h9zpl0s5k5hwuZ soft]# curl localhost:8080
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
    
            div{
                height: 250px;
                line-height: 250px;
                text-align: center;
            }
        </style>
    </head>
    <body>
    <div>
        <h1>Hello Spring Boot</h1>
    </div>
    </body>
    </html>
    # 可以看到已经返回了内容
    
    #可以将服务设置开机自启 系统开机时自动启动该服务
    systemctl enable myBoot.service
    

二、service /etc/init.d/ 方式注册服务

  1. 移除上面的systemctl 服务配置

    # 删除配置
    rm -rf /lib/systemd/system/myBoot.service
    # 重新加载配置
    systemctl daemon-reload
    
  2. 创建服务脚本

    # 创建脚本文件
    touch /etc/init.d/springboot
    
  3. 编写脚本内容

    vim /etc/init.d/springboot
    

    写入以下内容

    #!/bin/bash
    
    # 程序路径
    JAR_PATH="/soft"
    # 服务名称
    SERVICE_NAME="springboot-demo-0.0.1-SNAPSHOT.jar"
    # 输出日志文件
    LOG_FILE="/soft/application.log"
    
    # 启动函数
    start() {
        stop
        echo "Starting $SERVICE_NAME..."
        # 这里编写启动逻辑
        java -jar "$JAR_PATH/$SERVICE_NAME" > $LOG_FILE 2>&1
        echo "view Log In File $LOG_FILE"
    }
    
    # 停止函数
    stop() {
        echo "Stopping $SERVICE_NAME..."
        # 这里编写停止逻辑
        pid=$(ps aux | grep '[s]pringboot-demo-0.0.1-SNAPSHOT.jar' | awk '{print $2}')
            if [ -n "$pid" ]; then
                echo "$SERVICE_NAME pid is $pid"
                kill "$pid"
            fi
    }
    
    # 重启函数
    restart() {
        stop
        start
    }
    
    # $1 表示命令行第一个参数
    case "$1" in
        start)
            start
            ;;
        stop)
            stop
            ;;
        restart)
            restart
            ;;
        *)
            echo "Usage: $0 {start|stop|restart}"
            exit 1
            ;;
    esac
    
  4. 添加脚本执行权限

    chmod +x /etc/init.d/springboot
    
  5. 启动服务

    # /etc/init.d/下的服务 将由service 管理
    # service springboot start|stop|restart 的 start|stop|restart 不是像 systemd 固定的,而是传入脚本的参数,由脚本决定
    
    # 启动
    service springboot start
    
    # 验证启动状态,访问接口成功访问
    [root@iZbp1cv33h9zpl0s5k5hwuZ ~]# curl localhost:8080
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
    
            div{
                height: 250px;
                line-height: 250px;
                text-align: center;
            }
        </style>
    </head>
    <body>
    <div>
        <h1>Hello Spring Boot</h1>
    </div>
    </body>
    
    # 停止
    service springboot stop
    
    # 重启
    service springboot restart
    

三、chkconfig 方式注册服务

这种方式在老版本的CentOS中广泛使用,但是现在大部分发行版都不使用chkconfig 管理服务。
这里就简单提一提,有兴趣的可以研究研究。
  1. 创建服务脚本
    首先,你需要一个服务脚本。这个脚本通常放在 /etc/init.d/ 目录下,脚本名称通常是服务的名字。服务脚本需要包含至少启动 (start)、停止 (stop)、重启 (restart) 函数,并且要有 chkconfig 需要识别的注释行来指定服务的运行级别和启动/关闭优先级。

    一个简单的服务脚本模板如下所示:

    #!/bin/bash
    
    # chkconfig: 345 90 10
    # description: My Awesome Service
    
    start() {
        # 启动服务的命令
        echo "Starting My Awesome Service..."
    }
    
    stop() {
        # 停止服务的命令
        echo "Stopping My Awesome Service..."
    }
    
    restart() {
        stop
        start
    }
    
    case "$1" in
        start)
            start
            ;;
        stop)
            stop
            ;;
        restart)
            restart
            ;;
        *)
            echo "Usage: $0 {start|stop|restart}"
            exit 1
    esac
    
    exit 0
    

    确保脚本具有执行权限,可以通过以下命令设置:

    chmod +x /etc/init.d/服务名

  2. 注册服务
    使用 chkconfig --add 命令将服务脚本添加到 chkconfig 的管理系统中:
    chkconfig --add 服务名

  3. 设置服务的启动级别
    接下来,你可以使用 chkconfig 命令来设置服务在哪些运行级别上启动。如果不指定运行级别,默认是所有预定义的运行级别。例如,要让服务在运行级别3和5上启动,可以执行:
    chkconfig --level 35 服务名 on

  4. 验证
    最后,你可以使用 chkconfig --list 服务名 来检查服务是否成功注册,并查看其在各运行级别的状态。

四、总结

目前大部分系统都默认使用Systemd管理服务,推荐使用第一种方式。第二种方式不支持开机自启 可以配合chkconfig 设置开机自启。service、chkconfig 旧版本用的多。

  • 22
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linux系统,虚拟文件系统(Virtual File System,VFS)是一个抽象层,用于统一管理不同文件系统的接口和操作。它提供了一种统一的文件系统访问方式,使得应用程序可以透明地处理不同类型的文件系统,而无需关心底层文件系统的差异。 虚拟文件系统的管理机制主要包括以下几个方面: 1. VFS数据结构:VFS维护了一些重要的数据结构,如超级块(superblock)、索引节点(inode)、文件描述符(file descriptor)等。这些数据结构用于表示文件系统的状态和属性,并提供了对文件和目录的访问接口。 2. 文件系统注册:在Linux系统启动时,各个文件系统需要向VFS注册自己的操作函数和属性。这样,当用户程序请求访问某个文件系统时,VFS可以根据文件路径的前缀判断应该使用哪个文件系统的操作函数。 3. 文件路径解析:当用户程序提供一个文件路径时,VFS负责将路径解析为具体的文件系统和索引节点。它会逐级搜索路径的目录,并调用相应文件系统的操作函数进行路径解析和权限检查。 4. 文件缓存管理:为了提高文件访问效率,VFS采用了文件缓存(Page Cache)机制。它将最近访问的文件块缓存在内存,避免频繁的磁盘访问。文件缓存使用了LRU(Least Recently Used)算法来管理缓存的文件块。 5. 文件系统挂载:在Linux系统,可以通过挂载操作将一个文件系统关联到指定的挂载点上。VFS负责管理已挂载的文件系统,并提供了挂载、卸载和重新挂载等操作接口。挂载点形成了一个文件系统的树状结构,称为虚拟文件系统表(Virtual File System Table)。 通过这些机制,VFS实现了对不同文件系统的抽象和统一管理。它使得用户程序可以通过统一的文件系统接口进行文件操作,而无需关心底层文件系统的具体细节。这为Linux系统的灵活性和可扩展性提供了基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

20000_ZuuuuYao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值