WINDOWS脚本
@echo off Shell窗口不再打印指定,而只打印echo输出信息
call XXX 调用其他批处理,完成后继续执行下一行指令。
例如使用maven打包指定 mvn clean package,打包后默认会自动关闭dos窗口而不执行下一行命令,若使用call mvn XX则不会受到上面的影响。
关闭指定7700端口服务并重启:
@echo off
d:
cd "file\启动程序路径"
set port=7700
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do taskkill /F /pid %%m
start "ServiceName" "D:\绝对路径\程序.exe"
LINUX脚本
#!/bin/bash 代表这是个可执行脚本。
source /etc/profile //使用source /etc/profile编译后只能在当前终端生效,重新开启一个终端后,该环境变量失效。
export JAVA_HOME="" //可新增,修改或删除环境变量
除了if,shell还支持for、case
explain:例如这条shell,代表syserr2与sysout1合并,并且sysout1指向log文件。
nohub & 作用详解
脚本里不少见nohub sh XXX.sh &,里面nohub和&作用是什么?
使用&后台运行程序:
-
结果会输出到终端
-
使用Ctrl + C发送SIGINT信号,程序免疫
-
关闭session发送SIGHUP信号,程序关闭(关闭远程SSH回话)
使用nohup运行程序:
-
结果默认会输出到nohup.out
-
使用Ctrl + C发送SIGINT信号,程序关闭
-
关闭session发送SIGHUP信号,程序免疫
平日线上经常使用nohup和&配合来启动程序:
-
同时免疫SIGINT和SIGHUP信号,达成守护线程运行(其实一般nohup也够用了)
变量$含义
$$:shell本身的PID
$!:shell最后运行的后台PID
$?:最后运行的命令的结束代码(返回值)
$*:所有参数列表,如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$0:shell本身的文件名
$1~$n:添加到shell的各参数值,依次是第一个,第二个,...
脚本示例
1.启动模块sh
#!/bin/sh
#
# Start/Stop the centrum server.
#
SERVER_PID_DIR="./logs"
SERVER_LOG="${SERVER_PID_DIR}/server.out"
SERVER_PID="${SERVER_PID_DIR}/server.pid"
CLASSPATH="conf:lib/$(ls lib | grep 'sharecommon'):lib/*"
if [ ! -d "${SERVER_PID_DIR}" ]; then
mkdir "${SERVER_PID_DIR}"
fi
if [ ! -f "${SERVER_LOG}" ]; then
touch "${SERVER_LOG}"
fi
loadJavaOpts () {
server_java_opts=`grep '^[ \t]*server\.java\.opts' ./conf/server.conf | sed 's/[ \t]*server\.java\.opts=//'`
if [ -z "${server_java_opts}" ]; then
echo "-XX:MaxPermSize=192m -Xmx512m -Xms512m"
fi
echo "${server_java_opts}"
}
waitForPid () {
MTRPID=${1}
MAXTRIES=${2}
TRIES=0
echo "waitForPid: waiting for ${MTRPID}"
while [ 1 -eq 1 ]; do
PIDCHECK=`kill -0 ${MTRPID} 2> /dev/null`
if [ $? -eq 1 ]; then
echo "centrum server PID ${MTRPID} exited"
return 1
fi
echo "waitForPid: PID ${MTRPID} still alive"
sleep 2
TRIES=`expr ${TRIES} + 1`
if [ ${TRIES} -ge ${MAXTRIES} ] ; then
echo "num TRIES exhausted: ${TRIES} -ge ${MAXTRIES}"
break
fi
done
echo "Centrum server PID ${MTRPID} did not exit."
return 0;
}
doStop () {
doStopSignal "TERM"
}
doStopSignal () {
SIGNAME=${1}
if [ "x${SIGNAME}" = "x" ] ; then
echo "No signal specified"
exit 127
fi
echo "checking pidfile exists: ${SERVER_PID}"
if [ -f "${SERVER_PID}" ] ; then
MTRPID=`cat ${SERVER_PID} | tr -d ' '`
if [ "x${MTRPID}" = "x" ] ; then
echo "centrum pid file was empty: ${SERVER_PID}"
exit 127
fi
jstack ${MTRPID} > centrum.stop.stack
kill -${SIGNAME} ${MTRPID} 2> /dev/null
waitForPid ${MTRPID} 60
if [ $? -eq 0 ] ; then
exit 1
fi
rm -f ${SERVER_PID}
else
echo "centrum server not running (no pid file found: ${SERVER_PID})"
fi
}
doStart () {
# Is the server already running?
echo "checking pidfile exists: ${SERVER_PID}"
if [ -f "${SERVER_PID}" ] ; then
MTRPID=`cat ${SERVER_PID} | tr -d ' '`
if [ ! "x${MTRPID}" = "x" ] ; then
PIDCHECK=`kill -0 ${MTRPID} 2> /dev/null`
if [ $? -eq 1 ]; then
echo "Removing stale pid file ${SERVER_PID}"
rm -f ${SERVER_PID}
else
echo "centrum server is already running (pid ${MTRPID})."
exit 0
fi
fi
fi
# Setup JAVA_OPTS from server.conf
JAVA_OPTS=`loadJavaOpts`
# Start the server
echo "Booting the centrum server (Using JAVA_OPTS=${JAVA_OPTS})..."
java -Dfile.encoding=UTF-8 ${JAVA_OPTS} -cp ${CLASSPATH} com.xuanwu.msggate.centrum.core.server.CentrumServer > ${SERVER_LOG} 2>&1 &
# Save the pid to a pidfile
MTRPID=$!
echo "${MTRPID}" > ${SERVER_PID}
}
case "$1" in
start)
echo "Starting centrum server..."
doStart
echo "centrum server booted."
;;
stop)
echo "Stopping centrum server..."
doStop
echo "centrum server is stopped."
;;
*)
# Print help, don't advertise halt, it's nasty
echo "Usage: $0 {start|stop}" 1>&2
exit 1
;;
esac
exit 0