gpt4 book ai didi

linux - 更高效的脚本?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:48 25 4
gpt4 key购买 nike

我刚刚将四 block Raspberry Pi 3 组合在一起作为专用的 BOINC 集群。我喜欢我所拥有的,但由于我的主要桌面环境是 Linux(Windows 具有良好的 GUI 和远程监控支持,但 Linux 等价物似乎已失效),因此监控进度有点麻烦。

无论如何,我把这个 bash 脚本放在一起来跟踪事情

#!/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"

输出看起来像这样:

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

我不知道 bc 与其他替代方案相比的效率,也不知道这个脚本实例化了多少 shell。显然,由于 RPi3 在每美元 FLOPS 方面是一台动力不足的机器,因此此构建主要不关心效率……但仍然如此!我想知道我可以做些什么来获得我想要的信息。跟踪工作负载并不是那么重要,但 CPU 温度和核心时钟很重要。

提前致谢。 =)

编辑:根据请求,boinccmd --get_tasks 看起来像这样:

pi@serverpi:~ $ 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,然后为每个任务调用了三次 bc。因此,对于 14 个任务,您将有 45 个进程,而您可以只调用一次 boinccmd 和一次 awk 并获得大致相同的结果。

我没有永远为你做这一切,但它可能看起来像这样简单:

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}'

关于linux - 更高效的脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39308556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com