我使用了another post on SO中的这个命令行程序来描述如何蜘蛛网站。
wget --spider --force-html -r -l2 http://example.com 2>&1 | grep '^--' | awk '{ print $3 }' | grep -v '\.\(css\|js\|png\|gif\|jpg\)$' > wget.out
当我抓取一个大型网站时,需要很长时间才能完成。同时磁盘上的wget.out文件显示零大小。那么管道数据何时被处理并写入磁盘上的文件?管道中的每个阶段都已经完成了吗?在这种情况下,整个爬行结束后wget.out会填满吗?
如何让程序间歇性地写入磁盘,这样即使爬行阶段被中断,我也会保存一些输出?
答案 0 :(得分:1)
每个管道都有缓冲,也许在每个程序的stdio层中。在最终的grep处理了足够的行以使其缓冲区填充到溢出到磁盘的位置之前,数据不会进入磁盘。
如果在命令行上运行管道,然后按 Ctrl - C ,sigint
将被发送到每个进程,终止每个进程,并且丢失任何未决的输出。
或者:
忽略所有进程中的sigint
,但第一个进程。 Bash hackery如下:
$ wget --spider --force-html -r -l2 http://example.com 2>&1 grep '^--' | { trap '' int; awk '{ print $3 }'; } | ∶
只需将键盘中断传递给第一个进程即可。通过互动方式,您可以使用jobs -l
然后kill
来发现pid。 (在后台运行管道。)
$ jobs -l [1]+ 10864 Running wget 3364 Running | grep 13500 Running | awk ∶ $ kill -int 10864
使用disown
bash内置游戏。