Linux 服务脚本 start.sh、run.sh 和 stop.sh 的示例详解

文章目录

  • 1、start.sh 脚本
  • 2、start.sh 解析
  • 3、run.sh 脚本
  • 4、run.sh 解析
  • 5、stop.sh 脚本
  • 6、stop.sh 解析

1、start.sh 脚本

# !/bin/bash
ServiceName="ServiceHost"
BASEPATH="/wen/Web.Test.Service"
#修改打开的文件句柄数量,可以根据需要选择是否设置
ulimit -n 100000cd $BASEPATH#设置部署目录用户权限
chown -R dev:users $BASEPATH
find $BASEPATH -type d -exec chmod 0750 {} \;
find $BASEPATH -type f -exec chmod 0640 {} \;
chmod 740 bin/*.sh# /bin/su -p dev -c ./bin/run.sh (推荐)
/bin/su -p -c ./bin/run.sh dev 

2、start.sh 解析

这个 Bash 脚本主要用于启动一个名为 ServiceHost 的服务,并进行了一系列的环境配置和权限设置。

  • 1、脚本声明和变量定义:

    #!/bin/bash
    ServiceName="ServiceHost"
    BASEPATH="/wen/Web.Test.Service"
    
    • #!/bin/bash:这是脚本的 shebang 行,指定了脚本的解释器为 /bin/bash
    • ServiceName="ServiceHost":定义了一个变量 ServiceName,用于存储服务名称。
    • BASEPATH="/wen/Web.Test.Service":定义了一个变量 BASEPATH,表示服务的基路径。
  • 2、修改打开的文件句柄数量::

    ulimit -n 100000
    
    • ulimit -n 100000:设置当前 shell 进程可以打开的文件描述符的最大数量为 100000 。这对于需要同时处理大量文件或网络连接的服务可能很重要。
  • 3、切换到服务的基路径:

    cd $BASEPATH
    
    • cd $BASEPATH:改变当前工作目录到 BASEPATH 变量指定的路径。
  • 4、设置部署目录的用户权限:

    chown -R dev:users $BASEPATH
    find $BASEPATH -type d -exec chmod 0750 {} \;
    find $BASEPATH -type f -exec chmod 0640 {} \;
    chmod 740 bin/*.sh
    
    • chown -R dev:users $BASEPATH:递归地将 BASEPATH 目录及其下所有文件和子目录的所有者改为 dev 用户,组改为 users 组。
    • find $BASEPATH -type d -exec chmod 0750 {} \;:查找 BASEPATH 下的所有目录,并设置它们的权限为 0750 (所有者有读、写、执行权限,组用户有读、执行权限,其他用户无权限)。
    • find $BASEPATH -type f -exec chmod 0640 {} \;:查找 BASEPATH 下的所有文件,并设置它们的权限为0640(所有者有读、写权限,组用户有读权限,其他用户无权限)。
    • chmod 740 bin/*.sh:将 bin 目录下所有 .sh 脚本文件的权限设置为 740 (所有者有读、写、执行权限,组用户有读权限,其他用户无权限)。
  • 5、以特定用户身份执行启动脚本:

    /bin/su -p -c ./bin/run.sh dev
    
    • /bin/su -p -c ./bin/run.sh dev:使用 su 命令以 dev 用户的身份执行 ./bin/run.sh 脚本。
    • -p 选项通常用于提示用户输入密码,但在这个脚本中可能不会生效,因为通常脚本运行不会交互地输入密码。
    • 注意,这里可能有一个误解或错误,因为 -c 选项后应该直接跟要执行的命令字符串,而不是先跟用户。
    • 正确的用法可能依赖于具体的系统配置和 su 的实现,但通常我们期望看到类似 su - dev -c "./bin/run.sh" 的形式,或者如果 dev 用户不需要密码切换,可以省略 -p 并直接运行 su - dev -c "./bin/run.sh"
    • 表示指定要以目标身份 dev 执行 ./bin/run.sh 命令。

注意:脚本中最后一行可能需要根据实际情况进行调整,以确保以正确的用户身份执行启动脚本。此外,-p 选项在 su 命令中的使用可能需要根据实际环境进行验证,因为它通常用于交互式地提示密码,这在脚本自动化中通常不是期望的行为。

3、run.sh 脚本

# !/bin/bash
umask 0027
echo "Service is starting..."export JAVA_HOME=/usr/local/jdk18
export JRE_HOME=$JAVA_HOME/jre
ServiceName="ServiceHost"
BASEPATH="/wen/Web.Test.Service"cd $BASEPATH
./bin/stop.shexport LD_LIBRARY_PATH=/wen/commonsdk/expo4:$LD_LIBRARY_PATH
echo "Starting $ServiceName"
nohup java -jar -Xms4096M -Xmx4096M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./gclogs/dump -verbose:gc -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCDateStamps -Xloggc:./gclogs/gc.log ServiceBusHost.jar >/dev/null 2>&1 &
echo "LD_LIBRARY_PATH is $LD_LIBRARY_PATH"
echo "$ServiceName is started. "

4、run.sh 解析

这个 Bash 脚本使用的是Shell脚本语言,主要用于启动一个名为 ServiceHostJava 服务,并且包含了一些环境变量的设置和日志处理。通常用于Unix和类Unix系统(如Linux和macOS)中自动化任务。

  • 1、脚本声明:

    # !/bin/bash
    umask 0027
    echo "Service is starting..."
    
    • #!/bin/bash:这是脚本的 shebang 行,指定了脚本的解释器为 /bin/bash
    • umask 0027umask(用户文件创建模式掩码)是一个设置文件权限的命令。决定了新创建文件和目录的默认权限。 0027是一个八进制数,表示掩码值。
    • Unix类Unix 系统中,文件和目录的权限由三组数字表示(例如 rwxr-xr-- 可以表示为 755 ),对应所有者 owner、组 group 和其他用户 others 的读 r 、写 w 和执行 x 权限。
    • umask 值从默认权限中减去,以确定新创建文件和目录的实际权限。对于文件,默认权限是666(rw-rw-rw-),对于目录是777(rwxrwxrwx)。
    • 因此,umask 0027 意味着从默认权限中减去 ----w--w- (即其他用户的写权限和组的写权限)。对于文件,这将导致新文件的权限为644(rw-r–r–),对于目录,则为750(rwxr-x—)。
    • echo "Service is starting..."echo 是一个用于在终端输出文本的命令。"Service is starting..."echo 命令要输出的字符串。
  • 2、变量定义:

    export JAVA_HOME=/usr/local/jdk18
    export JRE_HOME=$JAVA_HOME/jre
    ServiceName="ServiceHost"
    BASEPATH="/wen/Web.Test.Service"
    
    • export JAVA_HOME=/usr/local/jdk18:设置 JAVA_HOME 环境变量,指向Java开发工具包(JDK)的安装目录。这里使用的是JDK 18
    • export JRE_HOME=$JAVA_HOME/jre:设置 JRE_HOME 环境变量,指向Java运行时环境(JRE)的目录。这个目录是 JAVA_HOME 下的 jre 子目录。
    • ServiceName="ServiceBusHost":定义服务名称变量 ServiceName ,用于后续脚本中引用服务名称。
    • BASEPATH="/wen/Web.Test.Service":定义基础路径变量 BASEPATH ,这是服务所在目录的路径。
  • 3、切换到服务目录并停止服务:

    cd $BASEPATH
    ./bin/stop.sh
    
    • cd $BASEPATH:切换到 BASEPATH 指定的目录,即服务的根目录。
    • ./bin/stop.sh:执行当前目录下的 bin 子目录中的 stop.sh 脚本,用于停止已经运行的服务。
  • 4、设置 LD_LIBRARY_PATH 和 日志:

    export LD_LIBRARY_PATH=/wen/commonsdk/expo4:$LD_LIBRARY_PATH
    echo "Starting $ServiceName"
    
    • export LD_LIBRARY_PATH=/wind/commonsdk/expo4:$LD_LIBRARY_PATH:设置 LD_LIBRARY_PATH 环境变量,用于指定动态链接器搜索共享库时应该查找的目录。这里将 /wind/commonsdk/expo4 添加到 LD_LIBRARY_PATH 的最前面,保留原有值。
    • echo "Starting $ServiceName":打印开始启动服务的消息。
  • 5、后台启动一个Java应用程序:

    nohup java -jar -Xms4096M -Xmx4096M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./gclogs/dump -verbose:gc -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCDateStamps -Xloggc:./gclogs/gc.log ServiceHost.jar >/dev/null 2>&1 &
    
    • 用于在后台启动一个 Java 程序(ServiceHost.jar),并配置了一系列的Java虚拟机(JVM)参数以及日志记录选项。
    • nohup:用于在用户注销 logout 后继续运行相应的命令,用于在你退出 shell 或终端会话后继续运行命令。
    • java -jar:这是 Java命令,用于运行一个打包成 JAR(Java ARchive)文件的应用程序。
    • -Xms4096M -Xmx4096M:设置 JVM 的初始堆大小(-Xms)和最大堆大小(-Xmx)为 4096MB即4GB)。
    • -XX:+HeapDumpOnOutOfMemoryError**:当 JVM 抛出 OutOfMemoryError 时,自动生成堆转储快照(heap dump)。
    • -XX:HeapDumpPath=./gclogs/dump:指定堆转储快照保存的路径。
    • -verbose:gc -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+PrintGCDateStamps:这些参数用于开启 GC(垃圾回收)日志的详细记录,包括每次 GC 前后堆的详细情况、GC 发生的日期时间戳等。
    • -Xloggc:./gclogs/gc.log:指定 GC 日志的输出文件路径。
    • ServiceBusHost.jar:这是要运行的 JAR 文件的名字。
    • >/dev/null 2>&1:这部分将标准输出(stdout)和标准错误输出(stderr)都重定向到 /dev/null ,即忽略所有输出。
      • >:是重定向操作符,/dev/null 是一个特殊的设备文件,向其写入的内容都会被丢弃。
      • 2>&1:表示将标准错误输出重定向到标准输出的当前位置(在这里是/dev/null)。
    • &:在命令末尾,这个符号表示将该命令置于后台执行。
  • 5、输出信息:

    echo "LD_LIBRARY_PATH is $LD_LIBRARY_PATH"
    echo "$ServiceName is started. "
    
    • echo "LD_LIBRARY_PATH is $LD_LIBRARY_PATH":打印环境变量 LD_LIBRARY_PATH 的值,这个变量通常用于指定动态链接器搜索共享库时应该搜索的目录。
    • echo "$ServiceName is started. ":打印一条消息表示服务已经启动。这里 $ServiceName 是一个变量,提供服务名字。

5、stop.sh 脚本

#!/bin/bashAppName=ServiceHost
ProcessName=ServiceHost.jarcd /wen/WebServiceis_exist(){pid=`ps -efww | grep $ProcessName | grep -v grep | awk '{print $2}'`if [ -z "${pid}" ]; thenreturn 1elsereturn 0fi
}while true
dois_existif [ $? -eq "0" ]; thenecho "$AppName is running, it is being stopped, please wait moment."kill ${pid}sleep 5elseecho "$AppName is stopped."breakfi
done

6、stop.sh 解析

这个脚本的主要功能是检查一个名为 ServiceBusHost.jar 的进程是否存在,如果存在,则停止它。

  • 1、定义变量并切换目录:

    #!/bin/bashAppName=ServiceHost
    ProcessName=ServiceHost.jarcd /wen/WebService
    
    • #!/bin/bash:这是脚本的 shebang 行,指定了脚本的解释器为 /bin/bash
    • AppName=ServiceHost:定义应用名称为 ServiceHost
    • ProcessName=ServiceHost.jar:定义进程名称为 ServiceHost.jar 。这个名称用于在系统中搜索运行的进程。
    • cd /wind/Wind.iSeller.JService:将当前工作目录切换到 /wen/WebService 。这通常是 ServiceHost.jar 文件所在的目录,或者是启动该进程的脚本所在的目录。
  • 2、定义函数 is_exist :

    is_exist(){pid=`ps -efww | grep $ProcessName | grep -v grep | awk '{print $2}'`if [ -z "${pid}" ]; thenreturn 1elsereturn 0fi
    }
    
    • 这个函数用于检查 ServiceHost.jar 进程是否存在。
    • 使用 ps -efww 命令列出系统中所有进程的详细信息。
    • grep $ProcessName 从所有进程中筛选出包含 ServiceHost.jar 的行。
    • grep -v grep 排除掉包含 grep 命令本身的行,因为 grep 命令本身也会出现在 ps 命令的输出中。
    • awk '{print $2}' 从筛选出的行中提取进程 ID(PID),这是每行的第二个字段。
    • 如果找到的 PID 为空(即 -z "${pid}"),表示进程不存在,函数返回 1;否则,表示进程存在,函数返回 0
  • 3、循环检查进程并尝试停止:

    while true
    dois_existif [ $? -eq "0" ]; thenecho "$AppName is running, it is being stopped, please wait moment."kill ${pid}sleep 5elseecho "$AppName is stopped."breakfi
    done
    
    • 使用 while true 创建一个无限循环。
    • 在循环中调用 is_exist 函数。
    • 如果函数返回 0(即进程存在),则执行以下操作:
      • 打印一条消息,说明 AppName 正在运行,并且即将被停止。
        - 使用 kill ${pid} 命令停止进程。${pid} 是之前通过 is_exist 函数找到的进程ID。
        - sleep 5 命令让脚本暂停5秒,这通常是为了等待进程完全停止。
    • 如果函数返回 1(即进程不存在),则执行以下操作:
      • 打印一条消息,说明 AppName 已经停止。
      • 使用 break 命令退出循环。

注意事项:

  • 脚本中使用的 kill 命令默认发送 SIGTERM 信号给进程,这是请求进程正常终止的标准方式。如果进程不响应 SIGTERM,可能需要使用 SIGKILL(即 kill -9 ${pid})来强制终止进程。
  • 在生产环境中,直接杀死进程可能不是最佳实践,因为它不允许进程进行任何必要的清理工作。更优雅的方式可能是通过发送特定的停止命令或信号给进程,让进程能够自己优雅地关闭。
  • 脚本假设 ServiceHost.jar 进程的名称是唯一的,并且不会与其他进程名混淆。如果系统中有多个类似名称的进程,这个脚本可能会错误地停止错误的进程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/461445.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SWAT-MODFLOW地表水与地下水耦合实践技术

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果,SWAT作为一个地表水模型可以较好的模拟主要的水文过程,包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等,但是对于地下水部分的模拟相对粗糙,考虑到SWAT…

江协科技STM32学习- P27 实验-串口发送/串口接收

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

Linux笔记--基础入门

文章目录 Linux基础知识点文件目录*磁盘分区**基础命令*Linux运行级别关机重启手册alias别名ntsysv系统服务管理程序 Linux常用命令命令分类命令行格式选项参数 命令行辅助操作 真常用命令()help命令:帮助指令man手册页manual page绝对路径与相对路径绝对路径&#…

11月1日星期五今日早报简报微语报早读

11月1日星期五,农历十月初一,早报#微语早读。 1、六大行今日起实施存量房贷利率新机制。 2、谷歌被俄罗斯罚款35位数,罚款远超全球GDP。 3、山西吕梁:女性35岁前登记结婚,给予1500元奖励。 4、我国人均每日上网时间…

Pandas DataFrame学习补充

1. 从字典创建:字典的键成为列名,值成为列数据。 import pandas as pd# 通过字典创建 DataFrame df pd.DataFrame({Column1: [1, 2, 3], Column2: [4, 5, 6]}) 2. 从列表的列表创建:外层列表代表行,内层列表代表列。 df pd.Da…

<项目代码>YOLOv8 煤矸石识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

推荐一款功能强大的文字处理工具:Atlantis Word Processor

Atlantis word proCEssor是一款功能强大的文字处理工具。该软件可以让用户放心的去设计文档,并且软件的界面能够按用户的意愿去自定义,比如工具栏、字体选择、排版、打印栏等等,当然还有更多的功能,比如你还可以吧软件界面中的任何…

「虚拟现实中的心理咨询:探索心灵世界的新方法」

内容概要 当我们想到虚拟现实时,很多人会联想到游戏或娱乐,但如今其在心理咨询领域的应用正在逐渐崭露头角。传统的心理咨询方式常常局限在咨询室内,面临着空间和情感隔阂的问题。然而,沉浸式环境的出现,使得治疗者能…

图像修复与重建——几何失真(畸变)的概念

一 几何失真(畸变)的概念 在实际的成像系统中,图像捕捉介质平面和物体平面之间不可避免地存在有一定的转角和倾斜角。转角对图像的影响是产生图像旋转,倾斜角的影响表现为图像发生投影变形。另外一种情况是由于摄像机系统本身的原…

Spark的集群环境部署

一、Standalone集群 1.1、架构 架构:普通分布式主从架构 主:Master:管理节点:管理从节点、接客、资源管理和任务 调度,等同于YARN中的ResourceManager 从:Worker:计算节点:负责利…

使用 Python 的 BeautifulSoup 与 Flask/Flask-RESTful 集成进行数据爬取和 API 构建

使用 Python 的 BeautifulSoup 与 Flask/Flask-RESTful 集成进行数据爬取和 API 构建 在现代 Web 开发中,许多应用需要从其他网页提取数据并将其呈现为 API 服务。Python 的 BeautifulSoup 是一个流行的 HTML 解析库,用于从网页抓取和解析数据&#xff…

江协科技STM32学习- P28 USART串口数据包

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

Verilog实现的莫尔斯电码发生器

莫尔斯或者摩尔斯电码(Morse Code),发明于1837年(另有一说是1836年),通过不同的排列顺序来表达不同的英文字母、数字和标点符号,在这里作一简单处理,仅产生点(Dit)和划(Dah),时长在0.25秒之内为点,超过为划…

PFC前端电路 -- EMI电路

一、EMI(Electromagnetic Interference)抗干扰电路 在PFC(功率因数校正)电路中,EMI(电磁干扰)滤波电路是至关重要的组成部分。EMI滤波电路的主要功能是抑制电磁干扰,以确保电源的电磁兼容性(EM…

网关三问:为什么微服务需要网关?什么是微服务网关?网关怎么选型?

文章整体介绍 本文旨在解答关于微服务网关的三个核心问题: 1)为什么需要网关?也即在何种场景下应采用微服务网关以优化系统架构; 2)什么是微服务网关?主要讲构成微服务网关的关键能力,包括但…

【深度学习】实验 — 动手实现 GPT【三】:LLM架构、LayerNorm、GELU激活函数

【深度学习】实验 — 动手实现 GPT【三】:LLM架构、LayerNorm、GELU激活函数 模型定义编码一个大型语言模型(LLM)架构 使用层归一化对激活值进行归一化LayerNorm代码实现scale和shift 实现带有 GELU 激活的前馈网络测试 模型定义 编码一个大…

基于vue框架的的考研网上辅导系统ao9z7(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:学生,公告信息,课程分类,考研资料,考研视频,课程信息,院校建议,教师 开题报告内容 基于Vue框架的考研网上辅导系统开题报告 一、研究背景与意义 随着高等教育的普及和就业竞争的加剧,考研已成为众多大学生提升学历、增强就…

GPU 学习笔记二:GPU单机多卡组网和拓扑结构分析(基于A100的单机多卡拓扑结构分析)

文章目录 一、物理拓扑结构A100讲解1.1 单机多卡拓扑结构 二、术语和基础技术介绍2.1 带宽单位2.2 PCIe及PCIe Switch2.3 NVLink2.4 网卡2.5 带宽瓶颈分析2.6 HBM2.7 CPU/GPU 三、其他典型物理拓扑3.1 H100/H800拓扑分析 防止遗忘和后续翻找的麻烦,记录下平时学到和…

Webserver(2.6)有名管道

目录 有名管道有名管道使用有名管道的注意事项读写特性有名管道实现简单版聊天功能拓展:如何解决聊天过程的阻塞 有名管道 可以用在没有关系的进程之间,进行通信 有名管道使用 通过命令创建有名管道 mkfifo 名字 通过函数创建有名管道 int mkfifo …

超分子水凝胶与细胞的互动:现状、难题与未来蓝图

大家好!今天来了解超分子水凝胶文章——《Using Chemistry To Recreate the Complexity of the Extracellular Matrix: Guidelines for Supramolecular Hydrogel–Cell Interactions》发表于《Journal of the American Chemical Society》。在再生医学的舞台上&…