我有以下脚本,该脚本已运行超过 3 天:
seq -w 1 1000000 | while read i; do (./myscript.pl $i >> output.txt); done
是否有可能知道该序列已经进行了多远?
答案1
由于您正在为每个元素调用具有不同参数的命令,因此请检查该命令当前正在处理的参数。
ps w -C myscript.pl
write
您可以通过检查进程执行了多少系统调用来获得近似值seq
。使用pgrep seq
(或其他一些命令,例如ps uw -C seq
如果有多个seq
进程并且您需要确定所需的进程)查找进程 ID 。如果 PID 为1234
,则
grep syscw /proc/1234/io
从中读取进程的一些 IO 统计信息/proc
1.将此值加一² getconf PIPE_BUF /
,然后乘以 4096,即可得到已写入的字节数seq
。这是迄今为止写入的所有数字的总长度。由于您要打印等宽行,因此除以 8 即可得到到目前为止写入的数字数。
查看seq
已经走了多远的更方便的方法是跟踪它的系统调用strace
。在 Ubuntu 上,默认情况下,您需要 root 才能执行此操作。
$ strace -p1234
strace: Process 1234 attached
write(1, "0008193\n0008194\n0008195\n0008196\n"..., 4096^Cstrace: Process 1234 detached
在上面的示例中,seq
当读取端完成处理 8192 并准备好处理更多数据时,8193 是下一个将写入管道的数字。
1如果seq
正在写入常规文件,则cat /proc/1234/1/fdinfo
或lsof -p1234
将显示文件中的偏移量,即已写入的字节数seq
。但对于管道,您无法获得此信息。
²通过实验确定。我不知道为什么第一次写操作会写两次PIPE_BUF
。
答案2
我不知道你的脚本是做什么的,但是你可以watch cat output.txt
在另一个终端中监视你的输出文件是什么样子吗?
或者(我知道这不是您所要求的)也许可以像这样运行您的命令:
seq -w 1 1000000 | while read i; do (./myscript.pl $i >> output.txt & echo i); done
或者
seq -w 1 1000000 | while read i; do (./myscript.pl $i tee -a output.txt); done
答案3
使用pv
管道视图实用程序:
seq -w 1 1000000 | pv -lcs 1M |
while read i; do (./myscript.pl $i >> output.txt); done
...这将输出到标准错误错误率不断更新的进度条,显示已读取的行数以及当前已完成的行数的百分比。