#!/usr/bin/env bash
# 2>&1的含义# 1表示标准输出# 2表示标准错误输出# 2>&1表示将标准错误输出重定向到标准输出# 配置jar程序的pid保存文件jar_pid=/root/jar_pid
# 配置jar的绝对路径jar=/root/http-proxy-boot.jar
if["$1"="start"];then# 如果jar_pid文件存在if[ -f "$jar_pid"];then# 如果jar_pid文件有值if[ -s "$jar_pid"];thenecho"Existing PID file found during start."# 如果jar_pid文件可读if[ -r "$jar_pid"];thenPID=`cat "$jar_pid"`# 与直接执行命令相比, 这样可以抑制输出 ps -p $PID >/dev/null 2>&1# 等于0if[$? -eq 0];thenecho"$jar appears to still be running with PID $PID. Start aborted."echo"If the following process is not a $jar process, remove the PID file and try again:" ps -f -p $PIDexit1elseecho"Removing/clearing stale PID file."# 与直接执行命令相比, 这样可以抑制输出 rm -f "$jar_pid" >/dev/null 2>&1if[$? !=0];then# 可写权限if[ -w "$jar_pid"];then cat /dev/null > "$jar_pid"elseecho"Unable to remove or clear stale PID file. Start aborted."exit1fififielseecho"Unable to read PID file. Start aborted."exit1fielse rm -f "$jar_pid" >/dev/null 2>&1if[$? !=0];thenif[ ! -w "$jar_pid"];thenecho"Unable to remove or write to empty PID file. Start aborted."exit1fifififi# 将命令行参数往前移一个. 比如sh test.sh 1 2, 在shift前, $1=1 $2=2, 在shift后, $1=2shift# eval是将字符串解析为命令执行,如 eval "ls -l"就相当于直接运行性ls -leval"nohup java -jar \$jar >/dev/null 2>&1 &"# 将pid写入到jar_pid文件中echo$! > "$jar_pid"echo"$jar started."elif["$1"="stop"];thensleep=5# 当force为1时, 执行kill -9force=0shift# 若文件存在if[ -f "$jar_pid"];then# 若jar_pid有值if[ -s "$jar_pid"];then# kill -0不影响进程执行,而是检查进程是否正在运行kill -0 `cat "$jar_pid"` >/dev/null 2>&1# 如果大于0表示异常if[$? -gt 0];thenecho"PID file found but either no matching process was found or the current user does not have permission to stop the process. Stop aborted."exit1fielseecho"PID file is empty and has been ignored."fielseecho"$jar_pid was set but the specified file does not exist. Is $jar running? Stop aborted."exit1fi# 与直接kill -15相比, 这样可以抑制输出kill -15 `cat "$jar_pid"` >/dev/null 2>&1if[ -f "$jar_pid"];thenwhile[$sleep -ge 0];do# kill -0不影响进程执行,而是检查进程是否正在运行kill -0 `cat "$jar_pid"` >/dev/null 2>&1# 如果大于0表示异常, 表示进程已被关闭if[$? -gt 0];then rm -f "$jar_pid" >/dev/null 2>&1# 如果删除失败if[$? !=0];thenif[ -w "$jar_pid"];then cat /dev/null > "$jar_pid"force=0elseecho"The PID file could not be removed or cleared."fifiecho"$jar stopped."breakfiif[$sleep -gt 0];then sleep 1fiif[$sleep -eq 0];thenecho"$jar did not stop in time."if[$force -eq 0];thenecho"PID file was not removed."fiecho"To aid diagnostics a thread dump has been written to standard out."# kill -3 与 kill -15 类似, 只是kill -3 会多了一步生成核心存储,用于后续调试。kill -3适用于程序无响应时kill -3 `cat "$jar_pid"`fi# 自减sleep=`expr $sleep - 1`donefiKILL_SLEEP_INTERVAL=5if[$force -eq 1];thenif[ -f "$jar_pid"];thenPID=`cat "$jar_pid"`echo"Killing $jar with the PID: $PID"kill -9 $PIDwhile[$KILL_SLEEP_INTERVAL -ge 0];dokill -0 `cat "$jar_pid"` >/dev/null 2>&1if[$? -gt 0];then rm -f "$jar_pid" >/dev/null 2>&1if[$? !=0];thenif[ -w "$jar_pid"];then cat /dev/null > "$jar_pid"elseecho"The PID file could not be removed."fifiecho"The $jar process has been killed."breakfiif[$KILL_SLEEP_INTERVAL -gt 0];then sleep 1fiKILL_SLEEP_INTERVAL=`expr $KILL_SLEEP_INTERVAL - 1`doneif[$KILL_SLEEP_INTERVAL -lt 0];thenecho"$jar has not been killed completely yet. The process might be waiting on some system call or might be UNINTERRUPTIBLE."fififielseecho"commands:"echo" start Start jar"echo" stop Stop jar"fi