So teilen Sie ein Bash-Array in Argumente auf

So teilen Sie ein Bash-Array in Argumente auf

Ich habe ein Bash-Skript geschrieben, um Python-Prozesse, RAM-Nutzung und PID sowie Status in menschenlesbarer Form mit farbigen Linien aufzulisten. Ich habe jedoch einige Probleme mit der Ausführungszeit des Skripts. Aufgrund der wiederholt geschriebenen psBefehle dauert die Ausführung zu lange.

SCRPITS=`ps x | grep python | grep -v ".pyc" | grep -v grep | awk  '{print $NF}'`

prepare_text () {
    if [[ ${2%.*} -gt ${RAMLIMIT} ]]; then
        # RED
        TEXT=`printf "\033[31m%-62s %'10d %2s %5s %6s\n\033[0m" "${1}" "${2}" "KB" "${3}" "${4}"`
    elif [[ ${2%.*} -gt ${RAMLIMIT}/2 ]]; then
        # YELLOW
        TEXT=`printf "\033[33m%-62s %'10d %2s %5s %6s\n\033[0m" "${1}" "${2}" "KB" "${3}" "${4}"`
    else
        # GREEN
        TEXT=`printf "\033[32m%-62s %'10d %2s %5s %6s\n\033[0m" "${1}" "${2}" "KB" "${3}" "${4}"`
    fi
    TEXTBODY+=${TEXT}
}

display () {
    printf "$SUBJECT\n"
    printf "%-62s %13s %5s %8s\n" "PROCESS" "RAM USAGE" "PID" "STATUS"
    printf "===========================================================================================\n"
    printf "${TEXTBODY}\n"
}


for SCRIPT in ${SCRPITS}
do
    USAGE=`ps aux | grep ${SCRIPT} | grep -v "grep" | awk '{print $6}'`
    PID=`ps aux | grep ${SCRIPT} | grep -v "grep" | awk '{print $2}'`
    STATUS=`ps aux | grep ${SCRIPT} | grep -v "grep" | awk '{print $8}'`
    prepare_text ${SCRIPT} ${USAGE} ${PID} ${STATUS}
done
display
exit $?

Ich habe mich entschlossen, diesen Ansatz zu ändern und das gesamte Skript zur Verkürzung der Arbeitszeit wie folgt neu anzuordnen:

OIFS=$IFS #save original
IFS='\n'
SCRIPTS=`ps aux | grep python | grep -v ".pyc" | grep -v grep | awk '{print $NF,",",$5,",",$2,",",$8}'`
IFS=${OIFS}
prepare_text () {
    if [[ $((${2%.*})) -gt ${RAMLIMIT} ]]; then
        # RED
        TEXT=`printf "\033[31m%-62s %'10d %2s %5s %6s\n\033[0m" "${1}" "${2}" "KB" "${3}" "${4}"`
    elif [[ $((${2%.*})) -gt ${RAMLIMIT}/2 ]]; then
        # YELLOW
        TEXT=`printf "\033[33m%-62s %'10d %2s %5s %6s\n\033[0m" "${1}" "${2}" "KB" "${3}" "${4}"`
    else
        # GREEN
        TEXT=`printf "\033[32m%-62s %'10d %2s %5s %6s\n\033[0m" "${1}" "${2}" "KB" "${3}" "${4}"`
    fi
    TEXTBODY+=${TEXT}
}

display () {
    printf "$SUBJECT\n"
    printf "%-62s %13s %5s %8s\n" "PROCESS" "RAM USAGE" "PID" "STATUS"
    printf "===========================================================================================\n"
    OIFS=$IFS
    IFS=","
    set ${SCRIPTS}
    for SCRIPT in ${SCRIPTS}
    do
    prepare_text $1 $2 $3 $4
    done
    printf "\n\n"
    IFS=${OIFS}
    printf "${TEXTBODY}\n"
}


display
exit $?

Jetzt kann ich alle gewünschten Informationen pssofort abrufen, habe jedoch einige Probleme mit der Formatierung und Anzeige dieser Informationen.

Ich kann nicht herausfinden, wie ich die einzelnen Argumente abrufen ${SCRIPTS}, aufteilen und an prepare_textdie Funktion übergeben kann.

Ich glaube, ich verstehe etwas falsch.

Antwort1

Ich schlage vor, dass Sie nur die Informationen extrahieren, die Sie benötigen ps, und sonst nichts, und awk(nicht bash) den Rest erledigen lassen: Grepping, Vergleiche, Formatierung. Beispiel:

ps -ax --no-headers -o pid,vsz,stat,command |
awk -v lim=23000 '
# let awk do the grepping
/bash/ && !/awk/ {
  # save first 3 fields
  pid=$1
  vsz=$2
  stat=$3
  # rest is command line, possibly spanning multiple fields
  for (i=4;i<=NF;++i) $(i-3)=$i
  NF-=3
  # decide on color
  if (vsz>lim) col="\033[31m"
  else if (vsz>lim/2) col="\033[33m"
  else col="\033[32m"
  # printout
  printf("%s%-62s %10d KB %5s %6s%s\n",
    col, $0, vsz, pid, stat, "\033[0m")
}'

Optimieren Sie Werte und fügen Sie nach Bedarf Überschriften hinzu.

verwandte Informationen