私は、Pythonプロセス、RAM使用量、PID、および状態を人間が読める形式でカラーラインとしてリストするbashスクリプトを作成しました。しかし、スクリプトの作業時間に問題があります。繰り返し命令を作成すると、ps
仕事に時間がかかりすぎます。
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 $?
私はこのアプローチを変更し、作業時間を短縮するために、すべてのスクリプトを次のように再配置することにしました。
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 $?
これで、必要な情報をすぐに取得できるようになりますが、ps
その情報のフォーマットと表示にはいくつかの問題があります。
${SCRIPTS}
各パラメータをどのようにインポートして分割してprepare_text
関数に渡すのかわかりません。
私が何かを間違って理解したと思います。
答え1
ここで必要な情報だけを抽出し、ps
他は何も抽出せず、残りはawk
(ではなく)収集、比較、フォーマット化などの作業を行うようにしてください。bash
例:
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")
}'
値を調整し、必要に応じてタイトルを追加します。