我在网上搜索是否已经有一种方法可以对可执行文件/脚本的某个部分进行计时,以查看该部分需要多长时间,但我找到的更多内容都是文件之外的内容。所以我想输入一行来启动计时器,并在该部分结束时停止计时器并显示经过的时间,不是整个过程,而是一部分。
示例:
#!/bin/sh
IPTABLES="/sbin/iptables"
BLOCKEDIPS_XS=/root/iptables/iptables/blockxs.zone
$IPTABLES -F
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES --delete-chain
$IPTABLES -F FORWARD
$IPTABLES -F -t mangle
$IPTABLES -F -t nat
$IPTABLES -X
timer start
/bin/egrep -v "^#|^$" $BLOCKEDIPS_XS | while IFS= read -r ip
do
# Append everything to droplist
$IPTABLES -A droplist -i eth0 -s $ip -j LOG --log-prefix " Drop IP List blockxs "
$IPTABLES -A droplist -i eth0 -s $ip -j DROP
done <"$BLOCKEDIPS_XS"
timer stops, shows elapsed time
答案1
你可以使用以下方法对部分 bash 脚本进行计时命令分组
#!/bin/bash
echo "foo"
sleep 1
time {
sleep 2
echo "bar"
sleep 3
}
sleep 1
echo "baz"
前任。
$ ./somescript.sh
foo
bar
real 0m5.006s
user 0m0.005s
sys 0m0.001s
baz
使用子 shell 进行分组(即用圆括号代替大括号)也应该有效。
答案2
time
对命令组和变量进行操作的ASECONDS
都是 bash 功能,sh 中没有。使用 sh,您可以获取使用date
命令的两个点的时间戳,然后获取差值。date +%s
将给出自纪元以来的秒数。
# timer start
start=$(date +%s)
/bin/egrep -v "^#|^$" $BLOCKEDIPS_XS | while IFS= read -r ip
do
# Append everything to droplist
$IPTABLES -A droplist -i eth0 -s $ip -j LOG --log-prefix " Drop IP List blockxs "
$IPTABLES -A droplist -i eth0 -s $ip -j DROP
done <"$BLOCKEDIPS_XS"
# timer stops, shows elapsed time
echo $(( $(date +%s) - start ))
答案3
最简单的方法是将该time
命令放在正在运行的命令前面。例如:
$ time locate display-auto
/etc/cron.d/display-auto-brightness
/home/rick/Downloads/display-auto-brightness
/home/rick/Pictures/display-auto-brightness conky.png
/home/rick/Pictures/display-auto-brightness systray.png
/home/rick/Pictures/display-auto-brightness-config 1.png
/home/rick/Pictures/ps display-auto-brightness.png
/lib/systemd/system-sleep/display-auto-brightness
/mnt/e/etc/cron.d/display-auto-brightness
/mnt/e/lib/systemd/system-sleep/display-auto-brightness
/mnt/e/usr/local/bin/display-auto-brightness
/usr/local/bin/display-auto-brightness
real 0m0.826s
user 0m0.803s
sys 0m0.016s
我们使用该命令来查找名称中locate
包含的所有文件名。只需在命令前面插入该命令即可。display-auto
time
获取部分脚本的时间
您可以使用$SECONDS
脚本中的变量来获取部分时间。例如:
SECONDS=0
/bin/egrep -v "^#|^$" $BLOCKEDIPS_XS | while IFS= read -r ip
do
# Append everything to droplist
$IPTABLES -A droplist -i eth0 -s $ip -j LOG --log-prefix " Drop IP List blockxs "
$IPTABLES -A droplist -i eth0 -s $ip -j DROP
done <"$BLOCKEDIPS_XS"
timer stops, shows elapsed time
BlockTime=$SECONDS
echo "Total time to block IPs: $BlockTime Seconds"
在此代码中,SECONDS
将其重置为零,然后经过漫长的过程后获得。