我写了一个小的bash脚本来爬取URL的XML站点地图。 它使用xargs并行检索5个URL。
现在我想要一个电子邮件发送到所有的url已被抓取,所以它必须等到xargs的所有subprocess已经完成,然后发送邮件。
我用xargs之后的一个pipe道尝试过:
#!/bin/bash wget --quiet --no-cache -O- http://some.url/test.xml | egrep -o "http://some.url[^<]+" | xargs -P 5 -r -n 1 wget --spider | mail...
并wait
#!/bin/bash wget --quiet --no-cache -O- http://some.url/test.xml | egrep -o "http://some.url[^<]+" | xargs -P 5 -r -n 1 wget --spider wait mail ...
哪两个都不行,电子邮件在脚本执行后立即发送。 我怎样才能做到这一点? 不幸的是,我的服务器上没有parallel程序(托pipe托pipe)。
而不是使用xargs ,在后台单独产生每个wget ,并在列表中收集后台进程的PID。 此外,请确保后台进程的输出被写入文件。
一旦产生了所有后台进程,请遍历列表中的所有 PID并wait每个进程 – 已经退出的进程在wait时不会被阻塞。 现在,希望能够成功地等待所有后台进程,所有剩下的工作就是将每个后台进程的输出连接到单个文件,并将其发送到需要输出的地方。
(回声当然是多余的,仅用于演示目的):
#!/bin/bash mail=$(tempfile) pids=() outputs=() trap "rm -f ${outputs[@]}" EXIT trap "rm -f $mail" EXIT for url in $(wget --quiet --no-cache -O- http://some.url/test.xml |\ egrep -o "http://some.url[^<]+") ; do output=$(tempfile) wget --spider > $output 2>&1 & pids+=($!) outputs+=($output) echo "Spawned wget and got PID ${pids[-1]}." done for pid in ${pids[@]} ; do echo "Waiting for PID $pid." wait $pid done # Concatenate outputs from individual processes into a single file. for output in ${outputs[@]} ; do cat $output >> $mail ; done # Mail that file. < $mail mail -s "All outputs" [email protected] # end of file.