假设我有一个程序,它会向文件系统上的许多位置写入数据。它从单个可执行文件运行。我想确定在它运行的任何时刻(它会运行很长时间),它向磁盘写入了多少字节。
大多数人似乎喜欢用这样的工具pv
来完成这项任务,但它不适用于我的情况,因为有问题的可执行文件会写入文件系统上的许多不同位置,如果我要写入my_exec | pv <whatever> | cat
或诸如此类的话,my_exec
只会写出一大块数据,而不会像它应该的那样将其解析到文件夹中。
类似地,类似的东西iotop
也不是我想要的,因为我希望能够为我的 IO 繁重进程附加/分离一个“观察者”。
我知道这个问题似乎令人困惑,也许举个例子会有所帮助。我想做的是这样的。
my_exec &
local exec_pid = $?
mystery_command ${exec_pid} # continuously writes out the number of bytes
# written to disk by my_exec since the invocation
# of mystery_command
或者,也可以包装/监视另一个任意命令,如下所示:
{ my_exec } | mystery_command # my_exec will still write to folders as it
# should, but mystery_command will continuously
# output the number of bytes written to disk by
# the attached {} group.
答案1
如果您的 my_exec 程序没有输出到屏幕或任何日志文件等(例如,将 wchar 计数倾斜到 stdout、stderr 等输出),为什么不直接查看 linux 的 wchar 计数:
grep wchar /proc/${exec_pid}/io
再次, wchar 将包含写入文件的所有字符,并且 UNIX 中的所有内容(包括 /dev/null)都是文件,但如果程序除了数据文件之外没有任何内容,那么您将获得准确或接近(+-1 字节)准确的计数。
如果除了数据文件之外还有上述输出,那么您将很难与其他文件区分开来,而不能直接将计数器添加到 my_exec 的代码中(如果我有 my_exec 源,我就会这样做,无论如何 - 对单个计数器的 io 将是最少的)。
该计数将为您提供自 PID 启动以来的总数。计算自上次检查以来的数据只是将上次看到的值存储在临时文件或变量中,进行一些简单的 eval 数学运算等。一个快速而粗糙的 bash 脚本,没有错误检查、简洁性、花哨的参数等:
#!/bin/bash
# one param, PID of running process.
COUNTFILE="/tmp/counter"
WAIT="2"
if [ -r "$COUNTFILE" ]; then
LCOUNT="`cat $COUNTFILE`"
else
LCOUNT=0
fi
cd /proc/$1
while true; do
MYSTAMP="`date`"
TCOUNT="`grep wchar io |cut -d':' -f2`"
NCOUNT="`expr $TCOUNT - $LCOUNT`"
printf "$MYSTAMP: %9s bytes total, %9s bytes new\n" $TCOUNT $NCOUNT
LCOUNT="$TCOUNT"
echo "$LCOUNT" >$COUNTFILE
sleep $WAIT
done
# don't remove count file
exit
希望有所帮助。
答案2
你有没有尝试过斯特拉斯? 要将其附加到已经运行的进程,只需输入
strace -p $PID