我用Linux bash和awk编写了一个程序,在该系统必须休眠一段时间后,必须找到繁忙的运行时间和用于该进程的磁盘,并重新计算繁忙的运行时间和使用的磁盘,并将它们保存在文本文件中。 最后必须计算每个处理器的CPU使用率和磁盘使用率百分比,但它无法正常工作。
#!/bin/bash
proc_id=0
thread_id=0
re='^[0-9]+$'
cd "/proc" || exit
for proc_id in *;
do
if [[ $proc_id =~ $re ]] ; then
cd "$proc_id/task" || exit
for thread_id in *;
do
busy=$(awk '/se.sum_exec_runtime/{print $3}' sched )
read=$(awk '/read_bytes:/{print $2}' io )
write=$(awk '/write_bytes:/{print $2}' io )
echo -e "$proc_id\t$thread_id\t$busy\t$read\t$write""/home/start/$thread_id.txt_start"
cd ..
done
cd ../..
fi
done
awk '{ print "Disk start ",$10; }' /sys/block/sda/stat >> "$result_dir/Disk_Time_start"
echo "Time $(date +%s%N | cut -b 1-13)" >> "$result_dir/Disk_Time_start"
sleep 10s
cd "/proc/" || exit
for thread_id in *;
do
busy=$(awk '/se.sum_exec_runtime/{print $3}' sched )
read=$(awk '/read_bytes:/{print $2}' io )
write=$(awk '/write_bytes:/{print $2}' io )
echo -e "$proc_id\t$thread_id\t$busy\t$read\t$write"/home/start/$thread_id.txt_finish
cd ..
done
cd ../..
awk '{ print "Disk finish ",$10; }' /sys/block/sda/stat >> "$result_dir/Disk_Time_finish"
echo "Time $(date +%s%N | cut -b 1-13)" >> "$result_dir/Disk_Time_finish"
#Answers
start_rgx='^[0-9]+\.txt_start$'
cd $result_dir
for proc_id in *
do
if [[ $p =~ $re ]]; then
process_dir="$result_dir/$p"
mkdir -p $process_dir
task="/proc/$proc_id/task"
cd $task
for thread_id in *
do
touch "$process_dir/$t.txt_finish"
awk '$1 ~ /Name/ { print "process_name ",$2; }' "$t/status" >> "$process_dir/$t.txt_finish"
awk '$1 ~ /sum_exec_runtime/ { print "busy_time ",$3; }' "$t/sched" >> "$process_dir/$t.txt_finish"
awk '$1 ~ /read_bytes/ { print "read_bytes ",$2; }' "$t/io" >> "$process_dir/$t.txt_finish"
awk '$1 ~ /^write_bytes/ { print "write_bytes ",$2; }' "$t/io" >> "$process_dir/$t.txt_finish"
done
fi
done
awk '{ print "Disk ",$10; }' /sys/block/sda/stat >> "$result_dir/Disk_Time_finish"
echo "Time $(date +%s%N | cut -b 1-13)" >> "$result_dir/Disk_Time_finish"
#Answers
start_re='^[0-9]+\.txt_start$'
cd $result_dir
for proc_id in *
do
if [[ $proc_id =~ $re ]]; then
cd $proc_id
total_usage_time=0
total_usage_disk=0
for thread_id in *
do
if [[ $thread_id =~ $start_rgx ]]; then
tid=$(echo $thread_id | awk -F'.txt_start' '{print $1}')
if [[ -e "$tid.txt_finish" ]]; then
touch "$tid.result"
usage_time=$(awk 'FNR==NR && $1 ~ /busy_time/ {a[$1]=$2;next} $1 ~ /busy_time/ {print $2-a[$1]}' $thread_id $tid.txt_finish)
echo "thread_usage_time $usage_time" >> "$tid.result"
total_usage_time=$(echo "$total_usage_time + $usage_time" | bc)
io_read=$(awk 'FNR==NR && $1 ~ /read_bytes/ {a[$1]=$2;next} $1 ~ /read_bytes/ {print $2-a[$1]}' $t $tid.txt_finish)
io_write=$(awk 'FNR==NR && $1 ~ /write_bytes/ {a[$1]=$2;next} $1 ~ /write_bytes/ {print $2-a[$1]}' $thread_id $tid.txt_finish)
thread_usage_disk=$(echo "$io_read + $io_write" | bc)
echo "thread_usage_disk $thread_usage_disk" >> "$tid.result"
total_usage_disk=$(echo "$total_usage_disk + $thread_usage_disk")
fi
fi
done
touch "$p.total_result"
echo "process_usage_time $total_usage_time" >> "$p.total_result"
echo "process_usage_disk $total_usage_disk" >> "$p.total_result"
cd ".."
fi
done
exit 0