查找具有繁忙运行时间的eaach处理器的CPU和磁盘使用情况以及睡眠前后使用的磁盘

时间:2015-11-02 20:17:16

标签: linux bash awk

我用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

0 个答案:

没有答案