我有一个执行以下操作的可执行文件: 1.输出字符串BEGIN 2.等待一些随机时间 3.输出字符串END
我想在MacOS上使用python / bash / perl脚本执行以下操作:
我该如何干净利落地做到这一点?
答案 0 :(得分:1)
在bash中执行此操作的最简单(最好?)方法是调用date
并以秒为单位输出它的时间。 timer.sh
脚本将调用您的可执行文件(randbegend.sh
用于我的测试目的),然后查找BEGIN和END行以触发日期调用。一旦您的可执行文件退出,timer.sh
将计算并显示以秒为单位的时间增量。
#!/bin/bash
while read line; do
if [[ "$line" == "BEGIN" ]]; then
t1=$(date "+%s")
echo t1=$t1
elif [[ "$line" == "END" ]]; then
t2=$(date "+%s")
echo t2=$t2
fi
done < <(./randbegend.sh) # Change this to call your executable
echo "delta = $((t2 - t1)) seconds"
#!/bin/bash
sleep $((RANDOM % 5))
echo BEGIN
sleep $((RANDOM % 10))
echo END
$ ./timer.sh
t1=1292451820
t2=1292451825
delta = 5 seconds
$ ./timer.sh
t1=1292451886
t2=1292451889
delta = 3 seconds
$ ./timer.sh
t1=1292451896
t2=1292451903
delta = 7 seconds
答案 1 :(得分:1)
如果您只想要全秒级粒度,可以在perl中执行以下“one-liner”:
( echo BEGIN ; sleep 3s ; echo END ) | \
perl -ne 'print $_; if (/BEGIN/) { $begin_time = time(); } if (/END/) { $t = time()-$begin_time; print "time was : $t seconds" }'
产地:
BEGIN
[ 3 second delay ]
END
time was : 3 seconds
你可以在命令行执行我的( echo BEGIN ; sleep 3s ; echo END )
。
答案 2 :(得分:0)
在Python中:
您可以使用datetime
模块记录当前时间戳,在执行外部程序之前和之后,然后减去两个以获得执行时间。
您可以使用subprocess
模块执行外部程序。
所以代码看起来像是:
import datetime, subprocess
ts1 = datetime.datetime.now()
subprocess.Popen('/path/to/external/program')
ts2 = datetime.datetime.now()
print ts2-ts1
答案 3 :(得分:0)
你只需使用GAWK就可以做到:
exec | gawk '{if ($1 == "BEGIN") {t1 = systime()} else if ($1 == "END") {t2 = systime()}} END{print t2-t1" sec"}'
其中exec
是您的可执行文件。只有当您不需要精确度超过一秒的精度时,这才是好的。