プロセスと一般的なシステム情報に関する統計を取得しようとしています。ループなしでこれを実行すると正常に実行されますが、ループに入れると無効な文字のカスケードエラーのみが発生します。
#!/bin/bash
TOTALMEM=$(awk '{ print $1 }' /proc/meminfo)
l=$(ls /proc | grep '[0-9]$')
for pid in $l
do
PID=$pid
cmd=$(cat /proc/$PID/cmdline)
state=$(awk '{ print $3 }' /proc/$PID/stat)
utime=$(awk '{ print $14 }' /proc/$PID/stat)
stime=$(awk '{ print $15 }' /proc/$PID/stat)
pr=$(awk '{ print $18 }' /proc/$PID/stat)
state=$(awk '{ print $3 }' /proc/$PID/stat)
ttime=$(($utime+$stime))
mem=$(cat /proc/$PID/status | grep VmSize: | awk '{ print $2 }')
memp=$(echo "scale=2;$TOTALMEM / $mem" | bc -l)
memp="$memp%"
mem=$(echo "scale=2;$mem / 1024" | bc -l)
cpu=$ttime
usr=$(stat -c '%U' /proc/$PID)
process_string="$PID $usr $pr $mem $state $cpu $memp $ttime $cmd"
echo $process_string
done
これはエラーメッセージの例です。すべては次のように進みます(任意の文字によってエラーが発生します)。各インデックス(1から44まで)に対して複数回繰り返されます。
(standard_in) 1: illegal character: M
(standard_in) 1: illegal character: T
(standard_in) 1: syntax error
(standard_in) 1: illegal character: :
44番目のインデックスで終了すると、$memp(メモリ使用率)値を表示せずに$ process_string変数を印刷します。これは、すべての$ pid(プロセス)で発生するようです。
forループに入れると壊れますが、そうでなければ壊れず、なぜこれがうまくいくのかわかりません。
ベストアンサー1
最初のジョブが次のようになりたい場合もあります。
TOTALMEM=$(awk '{ print $2 }' /proc/meminfo | head -n 1)
それ以外の場合、この行には多くの値が表示されます(引用符を除く)。
memp=$(echo "scale=2;$TOTALMEM / $mem" | bc -l)
awkをよりよく使う方法は、探している実際のタグを一致させることです。
TOTALMEM=$(awk '/^MemTotal:/ { print $2 }' /proc/meminfo | head -n 1)