用于在 Bash 中对内存和时间进行基准测试的错误自制代码
Buggy home-made code to benchmark memory and time in Bash
Bash代码
我写了这段小代码来测量进程的时间和内存使用峰值。
# Get arguments
MaxMemory=""
MaxTime=""
Command=""
for (( i=4 ; i<="$#"; i++)); do
Command="${Command} ${!i}"
done
echo -e "MaxMemory = ${MaxMemory}\nMaxTime = ${MaxTime}\nCommand = ${Command}"
#### run the given Command in the background
${Command} &
#### Get pid
pid=$!
echo "pid = ${pid}"
#### Monitor resources
MemoryPeak=0
timeBefore=$(date +"%s")
while true;do
# Get memory
mem=$(ps -o rss,pid | grep ${pid} | awk '{print }')
# Break if the process has stopped running
if [[ ${mem} == "" ]]; then
#echo "process has stopped"
break
fi
# Set the MemoryPeak of memory
if [ "${mem}" -gt "${MemoryPeak}" ]; then
MemoryPeak=$mem
fi
# If it consumed too much memory, then kill
if [ "${MemoryPeak}" -gt "${MaxMemory}" ];then
#echo "process consumed too much memory"
kill ${pid}
break
fi
# If it consumed too much CPU time, then kill
timeAfter=$(date +"%s")
timeUsage=$((timeAfter - timeBefore))
if [ "${timeUsage}" -gt "${MaxTime}" ];then
#echo "process consumed too much time"
kill ${pid}
break
fi
# sleep
sleep 0.1
done
timeAfter=$(date +"%s")
timeUsage=$((timeAfter - timeBefore))
echo "MEM ${MemoryPeak} TIME ${timeUsage}"
名为 memAndTime
的命令与
中的命令相同
memAndTime ${MaxMemory} ${MaxTime} ./myProcess arg1 arg2 arg3
问题
我不是来讨论我不使用 timeout
、gtimeout
、memusg
或 ulimit
.
的原因的
该代码有时会发送以下一系列错误消息
264: integer expression expected
/usr/bin/memAndTime: line 36: [: 473268
644
912
372: integer expression expected
/usr/bin/memAndTime: line 36: [: 705108
652: integer expression expected
/usr/bin/memAndTime: line 36: [: 842760
384: integer expression expected
第36行是
if [ "${mem}" -gt "${MemoryPeak}" ]; then
感觉mem=$(ps -o rss,pid | grep ${pid} | awk '{print }')
内置的对象mem
有时可以以一列开头
我无法在使用此命令之外重现错误消息。此外,错误消息很少见,因此很难重现。我不明白是什么原因造成的。您能帮忙找出此错误消息的来源以及如何解决吗?
在您的 shell:
中尝试此命令
[ s -gt 1 ]
输出应该是这样的:
-bash: [: s: integer expression expected
即:一行错误信息.
我们在您的输出中看到了什么?
/usr/bin/memAndTime: line 36: [: 705108
652: integer expression expected
那是 2 行!怎么可能?
这条命令后 mem
你有多少行?
mem=$(ps -o rss,pid | grep ${pid} | awk '{print }')
您可能认为它是一个,但它可以更多。这是确保它始终包含最多一个值的一种肤浅方法:
mem=$(ps -o rss,pid | grep ${pid} | awk '{print ; exit}')
这里有一个更好、更可靠的方法:
mem=$(ps -o rss= -p $pid)
-o
参数中的=
可用于指定自定义header。仅附加 =
意味着空 header。如果所有列的 header 都是空的,则输出中会省略 header,因此需要像 tail
或其他过程一样将其删除。
Bash代码
我写了这段小代码来测量进程的时间和内存使用峰值。
# Get arguments
MaxMemory=""
MaxTime=""
Command=""
for (( i=4 ; i<="$#"; i++)); do
Command="${Command} ${!i}"
done
echo -e "MaxMemory = ${MaxMemory}\nMaxTime = ${MaxTime}\nCommand = ${Command}"
#### run the given Command in the background
${Command} &
#### Get pid
pid=$!
echo "pid = ${pid}"
#### Monitor resources
MemoryPeak=0
timeBefore=$(date +"%s")
while true;do
# Get memory
mem=$(ps -o rss,pid | grep ${pid} | awk '{print }')
# Break if the process has stopped running
if [[ ${mem} == "" ]]; then
#echo "process has stopped"
break
fi
# Set the MemoryPeak of memory
if [ "${mem}" -gt "${MemoryPeak}" ]; then
MemoryPeak=$mem
fi
# If it consumed too much memory, then kill
if [ "${MemoryPeak}" -gt "${MaxMemory}" ];then
#echo "process consumed too much memory"
kill ${pid}
break
fi
# If it consumed too much CPU time, then kill
timeAfter=$(date +"%s")
timeUsage=$((timeAfter - timeBefore))
if [ "${timeUsage}" -gt "${MaxTime}" ];then
#echo "process consumed too much time"
kill ${pid}
break
fi
# sleep
sleep 0.1
done
timeAfter=$(date +"%s")
timeUsage=$((timeAfter - timeBefore))
echo "MEM ${MemoryPeak} TIME ${timeUsage}"
名为 memAndTime
的命令与
memAndTime ${MaxMemory} ${MaxTime} ./myProcess arg1 arg2 arg3
问题
我不是来讨论我不使用 timeout
、gtimeout
、memusg
或 ulimit
.
该代码有时会发送以下一系列错误消息
264: integer expression expected
/usr/bin/memAndTime: line 36: [: 473268
644
912
372: integer expression expected
/usr/bin/memAndTime: line 36: [: 705108
652: integer expression expected
/usr/bin/memAndTime: line 36: [: 842760
384: integer expression expected
第36行是
if [ "${mem}" -gt "${MemoryPeak}" ]; then
感觉mem=$(ps -o rss,pid | grep ${pid} | awk '{print }')
内置的对象mem
有时可以以一列开头
我无法在使用此命令之外重现错误消息。此外,错误消息很少见,因此很难重现。我不明白是什么原因造成的。您能帮忙找出此错误消息的来源以及如何解决吗?
在您的 shell:
中尝试此命令[ s -gt 1 ]
输出应该是这样的:
-bash: [: s: integer expression expected
即:一行错误信息.
我们在您的输出中看到了什么?
/usr/bin/memAndTime: line 36: [: 705108 652: integer expression expected
那是 2 行!怎么可能?
这条命令后 mem
你有多少行?
mem=$(ps -o rss,pid | grep ${pid} | awk '{print }')
您可能认为它是一个,但它可以更多。这是确保它始终包含最多一个值的一种肤浅方法:
mem=$(ps -o rss,pid | grep ${pid} | awk '{print ; exit}')
这里有一个更好、更可靠的方法:
mem=$(ps -o rss= -p $pid)
-o
参数中的=
可用于指定自定义header。仅附加 =
意味着空 header。如果所有列的 header 都是空的,则输出中会省略 header,因此需要像 tail
或其他过程一样将其删除。