linux下使用脚本启动java、net程序

3/20/2024 11:25:47 AM
329
0

netcore 的启动脚本

#!/bin/bash
MAIN_CLASS=start.dll  #配置要启动的程序集名称
COMMAND="$1"  #获取脚本执行命令的第一个参数。第二个参数用 $2,其他参数依此类推

if [[ "$COMMAND" != "start" ]] && [[ "$COMMAND" != "stop" ]] && [[ "$COMMAND" != "restart" ]]; then
        echo "Usage:  ./progress.sh {start, stop, restart}"
        exit 0
fi


APP_BASE_PATH=$(cd `dirname $0`;pwd)
echo  ${APP_BASE_PATH}

function  start(){

    # 运行为后台进程,并在控制台输出信息
    	#dotnet ${APP_BASE_PATH}/${MAIN_CLASS} -name  blog &

    # 运行为后台进程,并且将信息输出到 nohup.out 文件
	nohup  dotnet  ${APP_BASE_PATH}/${MAIN_CLASS} -name  blog > nohup.out &
}

function stop()
{
    kill `pgrep -f ${APP_BASE_PATH}/${MAIN_CLASS}` 2>/dev/null
}

if [[ "$COMMAND" == "start" ]]; then
        start
elif [[ "$COMMAND" == "stop" ]]; then
    stop
else
    stop
    start
fi

java的启动脚本

#!/bin/bash

MAIN_CLASS=xxx.startclass
COMMAND="$1"

if [[ "$COMMAND" != "start" ]] && [[ "$COMMAND" != "stop" ]] && [[ "$COMMAND" != "restart" ]]; then
	echo "Usage:  ./progress.sh {start, stop, restart}"
	exit 0
fi


# Java 命令行参数,根据需要开启下面的配置,改成自己需要的,注意等号前后不能有空格
# JAVA_OPTS="-Xms256m -Xmx1024m -Dundertow.port=80 -Dundertow.host=0.0.0.0"
# JAVA_OPTS="-Dundertow.port=80 -Dundertow.host=0.0.0.0 -Dundertow.devMode=false"

# 生成 class path 值
APP_BASE_PATH=$(cd `dirname $0`; pwd)
CP=${APP_BASE_PATH}/config:${APP_BASE_PATH}/lib/*

function start()
{
    # 运行为后台进程,并在控制台输出信息
    java -Djava.awt.headless=true -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} &


    # 运行为后台进程,并且不在控制台输出信息
    # nohup java -Djava.awt.headless=true -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} >/dev/null 2>&1 &

    # 运行为后台进程,并且将信息输出到 output.log 文件
    #nohup java -Djava.awt.headless=true -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} > output.log &
    #tail -f /dev/null

    # 运行为非后台进程,多用于开发阶段,快捷键 ctrl + c 可停止服务
    # 当以此方式在Docker下启动时,由于是后台进程,无前台进程,Docker容器启动后会马上退出,
    # 需加命令tail -f /dev/null,就可以保持你的容器一直在前台运行
    # 或者使用以下的非后台进程运行
    #java -Djava.awt.headless=true -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS}
}

function stop()
{
    kill `pgrep -f ${APP_BASE_PATH}` 2>/dev/null
}

if [[ "$COMMAND" == "start" ]]; then
	start
elif [[ "$COMMAND" == "stop" ]]; then
    stop
else
    stop
    start
fi

一、使用脚本

1、作为可执行程序

将上面的代码保存为 progress.sh(任意名都可以),并 cd 到相应目录。

chmod +x ./progress.sh  #使脚本具有执行权限
//执行脚本
./progress.sh  start  #执行脚本 ./progress.sh  stop

注意,一定要写成 ./progress.sh,而不是 progress.sh,运行其它二进制的程序也一样,直接写 progress.sh,linux 系统会去 PATH 里寻找有没有叫 progress.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 progress.sh 是会找不到命令的,要用 ./progress.sh 告诉系统说,就在当前目录找。

2、作为解释器参数

/bin/sh progress.sh

这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

 

二、解释

(1)

$(cd `dirname $0`;pwd) 这段代码的意思是获取当前 Shell 脚本所在目录的绝对路径。

  • $0 为执行的文件名(包含文件路径),即执行脚本时键入到控制台的文件路径。例如:./progress.sh
  • `dirname $0`:这部分命令会返回 $0 所指的文件或目录的父目录的路径名。换句话说,它会返回当前 Shell 脚本所在的目录路径。
  • cd `dirname $0`:这部分命令会进入到 $0` 所在的目录中。
  • pwd:这部分命令会打印出当前工作目录的绝对路径。

因此,整个命令 $(cd `dirname $0`;pwd)的作用就是获取当前 Shell 脚本所在目录的绝对路径,并将其赋值给变量APP_BASE_PATH。

(2)

xxx >/dev/null 2>&1 的意思是将命令 xxx 的标准输出(stdout)重定向到 /dev/null,同时将标准错误输出(stderr)也重定向到标准输出,即都重定向到 /dev/null。

具体解释如下:

  • > 表示输出重定向符号,后面跟着要重定向的位置或文件。
  • /dev/null 是一个特殊的设备文件,它会丢弃所有写入它的数据。因此,将输出重定向到 /dev/null 相当于将其丢弃,即不会在终端显示也不会保存到文件中。
  • 2> 表示错误输出重定向符号,后面跟着要重定向的位置或文件。数字 2 表示标准错误输出。
  • &1 表示将标准错误输出重定向到与标准输出相同的位置。

因此,xxx >/dev/null 2>&1 就是将命令 xxx 的标准输出和标准错误输出全部重定向到 /dev/null,这样就能够达到忽略命令的输出和错误信息的效果。

(3)

nohup  dotnet  ${APP_BASE_PATH}/${MAIN_CLASS} -name  blog > nohup.out &  意思是在后台运行一段 dotnet 命令,并将标准输出重定向到文件 nohup.out

  • nohup: 表示不挂断地运行命令,即不受终端关闭的影响而继续运行。
  • dotnet ${APP_BASE_PATH}/${MAIN_CLASS} -name blog: 这部分是要运行的 dotnet 命令,${APP_BASE_PATH}/${MAIN_CLASS}指定了 dotnet 命令要执行的程序路径,-name blog 则是 dotnet 命令的参数。
  • > nohup.out: 表示将命令的标准输出重定向到 nohup.out 文件中,即命令执行过程中产生的输出会被写入到 nohup.out 文件中。
  • &: 表示在后台运行命令,即将命令放入后台执行而不阻塞当前 shell,允许你继续在 shell 中输入其他命令。

因此,整个命令 nohup dotnet ${APP_BASE_PATH}/${MAIN_CLASS} -name blog > nohup.out & 的作用是在后台以不挂断方式运行 dotnet 命令,并将标准输出重定向到 nohup.out 文件中。

(4)

 kill `pgrep -f ${APP_BASE_PATH}/${MAIN_CLASS}` 2>/dev/null  查找匹配的进程,并使用 kill 命令将其终止

  • pgrep -f ${APP_BASE_PATH}/${MAIN_CLASS}: 这部分命令用于查找包含 ${APP_BASE_PATH}/${MAIN_CLASS} 字符串的进程,其中 -f 选项表示要匹配整个命令行而不仅仅是进程名。
  • ``: 这个反引号操作会将 pgrep -f ${APP_BASE_PATH}/${MAIN_CLASS} 的结果作为要执行的命令。
  • kill: 表示发送信号给进程,通常用来终止一个进程。
  • 2>/dev/null: 表示将标准错误重定向到 /dev/null,即丢弃错误输出,这样即使没有匹配的进程也不会产生错误信息。

需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

 

 

全部评论



提问