if [ "$1" = "start" ]; then # 如果jar_pid文件存在 if [ -f "$jar_pid" ]; then # 如果jar_pid文件有值 if [ -s "$jar_pid" ]; then echo"Existing PID file found during start." # 如果jar_pid文件可读 if [ -r "$jar_pid" ]; then PID=`cat "$jar_pid"` # 与直接执行命令相比, 这样可以抑制输出 ps -p $PID >/dev/null 2>&1 # 等于0 if [ $? -eq 0 ] ; then echo"$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 $PID exit 1 else echo"Removing/clearing stale PID file." # 与直接执行命令相比, 这样可以抑制输出 rm -f "$jar_pid" >/dev/null 2>&1 if [ $? != 0 ]; then # 可写权限 if [ -w "$jar_pid" ]; then cat /dev/null > "$jar_pid" else echo"Unable to remove or clear stale PID file. Start aborted." exit 1 fi fi fi else echo"Unable to read PID file. Start aborted." exit 1 fi else rm -f "$jar_pid" >/dev/null 2>&1 if [ $? != 0 ]; then if [ ! -w "$jar_pid" ]; then echo"Unable to remove or write to empty PID file. Start aborted." exit 1 fi fi fi fi # 将命令行参数往前移一个. 比如sh test.sh 1 2, 在shift前, $1=1 $2=2, 在shift后, $1=2 shift # eval是将字符串解析为命令执行,如 eval "ls -l"就相当于直接运行性ls -l eval"nohup java -jar \$jar >/dev/null 2>&1 &" # 将pid写入到jar_pid文件中 echo $! > "$jar_pid" echo"$jar started." elif [ "$1" = "stop" ]; then sleep=5 # 当force为1时, 执行kill -9 force=0 shift # 若文件存在 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 ]; then echo"PID file found but either no matching process was found or the current user does not have permission to stop the process. Stop aborted." exit 1 fi else echo"PID file is empty and has been ignored." fi else echo"$jar_pid was set but the specified file does not exist. Is $jar running? Stop aborted." exit 1 fi # 与直接kill -15相比, 这样可以抑制输出 kill -15 `cat "$jar_pid"` >/dev/null 2>&1 if [ -f "$jar_pid" ]; then while [ $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 ]; then if [ -w "$jar_pid" ]; then cat /dev/null > "$jar_pid" force=0 else echo"The PID file could not be removed or cleared." fi fi echo"$jar stopped." break fi if [ $sleep -gt 0 ]; then sleep 1 fi if [ $sleep -eq 0 ]; then echo"$jar did not stop in time." if [ $force -eq 0 ]; then echo"PID file was not removed." fi echo"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` done fi KILL_SLEEP_INTERVAL=5 if [ $force -eq 1 ]; then if [ -f "$jar_pid" ]; then PID=`cat "$jar_pid"` echo"Killing $jar with the PID: $PID" kill -9 $PID while [ $KILL_SLEEP_INTERVAL -ge 0 ]; do kill -0 `cat "$jar_pid"` >/dev/null 2>&1 if [ $? -gt 0 ]; then rm -f "$jar_pid" >/dev/null 2>&1 if [ $? != 0 ]; then if [ -w "$jar_pid" ]; then cat /dev/null > "$jar_pid" else echo"The PID file could not be removed." fi fi echo"The $jar process has been killed." break fi if [ $KILL_SLEEP_INTERVAL -gt 0 ]; then sleep 1 fi KILL_SLEEP_INTERVAL=`expr $KILL_SLEEP_INTERVAL - 1 ` done if [ $KILL_SLEEP_INTERVAL -lt 0 ]; then echo"$jar has not been killed completely yet. The process might be waiting on some system call or might be UNINTERRUPTIBLE." fi fi fi else echo"commands:" echo" start Start jar" echo" stop Stop jar" fi