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)。
本文链接:https://blog.nnwk.net/article/1538
有问题请留言。版权所有,转载请在显眼位置处保留文章出处,并留下原文连接
Leave your question and I'll get back to you as soon as I see it. All rights reserved. Please keep the source and links
友情链接:
子卿全栈
全部评论