2016-09-03 15 views
1

私はちょうど専用のBOINCクラスターとしてラズベリー・パイ3の四重奏を一緒に投げました。私は私が持っているものが好きですが、私の主なデスクトップ環境はLinux(Windowsはリモートモニタリングをサポートしていますが、Linuxに相当するGUIは機能していません)のため、少し進歩しています。より効率的なスクリプトですか?

とにかく、私は物事

#!/bin/bash 

tasks=($(boinccmd --get_tasks | grep ')' | cut -d ')' -f1)) 
progress=($(boinccmd --get_tasks | grep fraction | awk '{ print $NF }')) 
remaining=($(boinccmd --get_tasks | grep remaining | awk '{ print $NF }')) 

tabs -4 &> /dev/null 

echo "${tasks[-1]} task(s)" 

for i in "${tasks[@]}"; do 
    if [ $(echo "${progress[((--i))]} > 0.000" | bc) -eq 1 ]; then 
    progress_as_percent=$(echo "scale=1; (${progress[((--i))]}*100)/1" | /usr/bin/bc) 
    remaining_as_hours=$(echo "scale=0; ${remaining[((--i))]}/3600" | /usr/bin/bc) 
    remaining_as_minutes=$(echo "scale=0; (${remaining[((--i))]}/60)-(${remaining_as_hours}*60)" | /usr/bin/bc) 
    echo -e "#$i"'\t'"${progress_as_percent}%"'\t'"${remaining_as_hours}:${remaining_as_minutes}" 
    fi 
done 

cpu_temp="$(sudo cat /sys/class/thermal/thermal_zone0/temp)" 
cpu_temp=$(echo "scale=1; ${cpu_temp}/1000" | bc) 

core0freq="$(sudo cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq)" 
core0freq=$(echo "scale=2; ${core0freq}/1000000" | bc) 
core1freq="$(sudo cat /sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_cur_freq)" 
core1freq=$(echo "scale=2; ${core1freq}/1000000" | bc) 
core2freq="$(sudo cat /sys/devices/system/cpu/cpu2/cpufreq/cpuinfo_cur_freq)" 
core2freq=$(echo "scale=2; ${core2freq}/1000000" | bc) 
core3freq="$(sudo cat /sys/devices/system/cpu/cpu3/cpufreq/cpuinfo_cur_freq)" 
core3freq=$(echo "scale=2; ${core3freq}/1000000" | bc) 

tabs -8 &> /dev/null 

echo 
echo "${core0freq}/${core1freq}/${core2freq}/${core3freq}GHz ${cpu_temp}'C" 

を追跡するために、このbashスクリプト一緒に投げ、出力は次のように程度になります。

12 task(s) 
#1  33.3% 11:14 
#3  29.2% 12:50 
#6  31.4% 12:15 
#10  31.6% 11:58 

1.20/1.20/1.20/1.20GHz 46.6'C 

私は考えに他の選択肢VS bcの効率を持っていませんまた、多くのシェルでもこの​​スクリプトがインスタンス化されていると確信しています。明らかに、RPi3はドル当たりFLOPSという点では低消費電力なマシンなので、このビルドは主に効率性に関係していませんが、それ以下のものはありません!私は後に情報を得るために何ができるのかを知りたい。ワークロードを追跡することは、それほど重要ではありませんが、CPUの温度とコアクロックは重要です。

ありがとうございます。 =)

EDIT:)私の場合には(のための

[email protected]:~ $ boinccmd --get_tasks 

======== Tasks ======== 
1) ----------- 
    name: p2030.20151124.G196.37-01.56.N.b3s0g0.00000_1563_1 
    WU name: p2030.20151124.G196.37-01.56.N.b3s0g0.00000_1563 
    project URL: http://einstein.phys.uwm.edu/ 
    report deadline: Sat Sep 17 01:19:42 2016 
    ready to report: no 
    got server ack: no 
    final CPU time: 28977.680000 
    state: downloaded 
    scheduler state: preempted 
    exit_status: 0 
    signal: 0 
    suspended via GUI: no 
    active_task_state: UNINITIALIZED 
    app version num: 142 
    checkpoint CPU time: 28917.330000 
    current CPU time: 28977.680000 
    fraction done: 0.502852 
    swap size: 127 MB 
    working set size: 125 MB 
    estimated CPU time remaining: 28691.772814 

そして、上の14個の別々の作業単位を:リクエストごとに、ここでboinccmd --get_tasksは次のようになります。

+0

多分あなたは典型的なou 'boinccmd --get_tasks'の出力? –

+0

出力を追加しました。 =) – musasabi

+1

この完全な混乱は、1つのAwkスクリプトにリファクタリングされるように見えます。 – tripleee

答えて

2

開始時にboinccmdを3回呼び出した後、各タスクに対してbcを3回呼び出すようです。したがって、14タスクの場合、プロセスは45プロセスとなりますが、boinccmdは1回、awkは1回だけ呼び出すことができます。

私はあなたのためにすべてを行うには永遠にありませんが、それは、このような単純なになります:

boinccmd --get_tasks | awk -F '[):]' ' 
    /^[0-9])/ {tasks++} 
    /fraction/ {pctdone=$2*100} 
    /remaining/ {hrs=int($2/3600) 
       mins=int(($2-(hrs*3600))/60) 
       printf "#%d\t%2.1f\t%d:%02d\n",tasks,pctdone,hrs,mins} 
    END{printf "%d task(s)\n",tasks} 
    ' 

出力

#1 50.3 7:58 
#2 98.0 1:00 
2 task(s) 

私はもう少しロジックに追加番号付けが改善されたので、次のようになります。

./boinccmd --get_tasks | awk -F '[):]' ' 
    /^[0-9])/  { tasks++; thisTask=$1; p=1 } 
    /fraction/  { pctdone=$2*100; if(pctdone<0.001)p=0 } 
    /remaining/ && p { hrs=int($2/3600); mins=int(($2-(hrs*3600))/60) 
         printf "#%d\t%2.1f\t%d:%02d\n",thisTask,pctdone,hrs,mins} 
    END{printf "%d task(s)\n",tasks}' 
+0

可能性を説明する時間をとってくれてありがとう、ありがとう。私はフィールドを印刷する以上のために 'awk'を使ったことはありませんでしたので、いくつかの読み方があります。 =) – musasabi

関連する問題