文章目录
- 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脚本语言,主要用于启动一个名为 ServiceHost
的 Java
服务,并且包含了一些环境变量的设置和日志处理。通常用于Unix和类Unix系统(如Linux和macOS)中自动化任务。
-
1、脚本声明:
# !/bin/bash umask 0027 echo "Service is starting..."
#!/bin/bash
:这是脚本的shebang
行,指定了脚本的解释器为/bin/bash
。umask 0027
:umask
(用户文件创建模式掩码)是一个设置文件权限的命令。决定了新创建文件和目录的默认权限。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
进程的名称是唯一的,并且不会与其他进程名混淆。如果系统中有多个类似名称的进程,这个脚本可能会错误地停止错误的进程。