我会尽力简短地描述,同时提供所有必需的信息。
我希望运行 Debian 上的 Transmission 的 NAS 前面的红色 LED 在下载 torrent 时闪烁红灯,然后在所有 torrent 完成后变为白色。
我正在尝试规划一个比原始脚本更高效的脚本:
#!/usr/bin/env bash
user=my_username
pass=my_password
dir=/Hitachi/Downloads/Temp/
trans="transmission-remote 0.0.0.0:9092 -n $user:$pass -l"
pid_file="/var/run/process.pid"
if [ -f $pid_file ]; then
exit
else
echo $$ > $pid_file
fi
flash_red () {
echo 0 > /sys/class/leds/dart\:white\:power/brightness
while true
do
echo 1 > /sys/class/leds/dart\:red\:power/brightness
sleep 0.5
echo 0 > /sys/class/leds/dart\:red\:power/brightness
sleep 0.5
done
}
flash_red &
while
[ "$($trans | awk '! /awk/ && /n[/]a/ {print $2}')" == "n/a" ] \
|| [[ $($trans | awk '! /awk/ && /%/ {print substr($2, 1, length($2)-1)}' | sort -n | head -n 1) -lt 100 ]] \
|| find $dir -mindepth 1 -maxdepth 1 | read
do
sleep 10
done
kill $!
echo 0 > /sys/class/leds/dart\:red\:power/brightness
echo 1 > /sys/class/leds/dart\:white\:power/brightness
rm $pid_file
exit
它效率很低,因为每 10 秒它必须探测“transmission-remote”两次,运行 awk 两次,并运行 sort、head 和 find 一次。
传输远程输出表格格式,需要进行排序才能获得所需的结果。
Transmission 确实具有一项功能,它会在 torrent 添加时运行一个脚本,并在 torrent 完成时运行不同的脚本。
有人能想到我可以利用此功能的方法(或任何其他方法,除了将 10 秒更改为其他时间)来降低闪存功能对系统的依赖吗?
答案1
它效率很低,因为每 10 秒它必须探测
transmission-remote
两次,运行awk
两次,然后sort
运行head
一次find
。
每次运行transmission-remote
一次,使用 oneawk
来完全处理输出。如果我没有看错你的脚本,你不需要sort
nor head
,甚至不需要 的类似功能awk
。相关代码可能如下:
query_transmission | awk 'NR!=1 && $1!="Sum:" && $2!="100%" {print "busy"; exit}'
其中query_transmission
是 shell 函数(而不是$trans
;参见我们如何运行存储在变量中的命令?busy
)。当且仅当存在第二列中未报告的非第一行、非最后一行时,代码片段才会打印100%
;否则输出将为空。query_transmission
通过将第一个字段与 进行比较来检测输出的最后一行Sum:
;这不太优雅,但是检测最后一行awk
通常也不太优雅。
你也不需要find
。下面一行会告诉你文件在$dir
(我假设变量已设置并且不为空)中,仅使用 shell,即不使用外部工具:
(shopt -s dotglob nullglob; set -- "$dir"/*; echo "$#")
(一个子shell,所以shopt
不会set
影响主shell)。
因此我认为你后面的条件while
可以简化为:
[ -n "$(query_transmission | awk 'NR!=1 && $1!="Sum:" && $2!="100%" {print "busy"; exit}')" ] \
|| (shopt -s dotglob nullglob; set -- "$dir"/*; [ "$#" -gt 0 ])
在你的脚本中你应该引用正确。