getopt()用法详解 https://blog.csdn.net/qq_22642239/article/details/106462986
#!/bin/bash# @Function# Find out the highest cpu consumed threads of java,and print the stack of these threads.## @Usage# $ ./show-busy-java-threads.sh## @author XieQingPROG=`basename $0`usage() {cat <EOFUsage: ${PROG} [OPTION]...Find out the highest cpu consumed threads of java,and print the stack of these threads.Example: ${PROG} -c 10Options:-p,--pid find out the highest cpu consumed threads from the specifed java process,default from all java process.-c,--count set the thread count to show,default is 5-h,--help display this help and exitEOFexit $1}ARGS=`getopt -n "$PROG" -a -o c:p:h -l count:,pid:,help -- "[email protected]"`[ $? -ne 0 ] && usage 1eval set -- "${ARGS}"while true; docase "$1" in-c|--count)count="$2"shift 2;;-p|--pid)pid="$2"shift 2;;-h|--help)usage;;--)shiftbreak;;esacdonecount=${count:-5}redEcho() {[ -c /dev/stdout ] && {# if stdout is console,turn on color output.echo -ne "\033[1;31m"echo -n "[email protected]"echo -e "\033[0m"} || echo "[email protected]"}# Check the existence of jstack command!if ! which jstack &> /dev/null; then[ -z "$JAVA_HOME" ] && {redEcho "Error: jstack not found on PATH!"exit 1}! [ -f "$JAVA_HOME/bin/jstack" ] && {redEcho "Error: jstack not found on PATH and $JAVA_HOME/bin/jstack file does NOT exists!"exit 1}! [ -x "$JAVA_HOME/bin/jstack" ] && {redEcho "Error: jstack not found on PATH and $JAVA_HOME/bin/jstack is NOT executalbe!"exit 1}export PATH="$JAVA_HOME/bin:$PATH"fiuuid=`date +%s`_${RANDOM}_$$cleanupWhenExit() {rm /tmp/${uuid}_* &> /dev/null}trap "cleanupWhenExit" EXITprintStackOfThread() {while read threadLine ; dopid=`echo ${threadLine} | awk '{print $1}'`threadId=`echo ${threadLine} | awk '{print $2}'`threadId0x=`printf %x ${threadId}`user=`echo ${threadLine} | awk '{print $3}'`pcpu=`echo ${threadLine} | awk '{print $5}'`jstackFile=/tmp/${uuid}_${pid}[ ! -f "${jstackFile}" ] && {jstack ${pid} > ${jstackFile} || {redEcho "Fail to jstack java process ${pid}!"rm ${jstackFile}continue}}redEcho "Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user}):"sed "/nid=0x${threadId0x} /,/^$/p" -n ${jstackFile}done}ps -Leo pid,lwp,user,comm,pcpu --no-headers | {[ -z "${pid}" ] &&awk '$4=="java"{print $0}' ||awk -v "pid=${pid}" '$1==pid,$4=="java"{print $0}'} | sort -k5 -r -n | head --lines "${count}" | printStackOfThread
