4

我正在尝试制作一个 bash 函数来执行多个网络抓取(使用 curl 等),并且我想让它们都在后台同时执行,并将它们的输出打印到标准输入。这怎么可能?

4

2 回答 2

8

这是一件容易的事!您&甚至可以将其用于函数:

#!/usr/bin/bash

x() { echo =$1=Solaris; sleep 1; echo =$1=East; sleep 1; echo =$1=Panta Rhei;}

x one&
x two&

echo Syrius; sleep 1
echo After Crying 

输出:

=one=Solaris
Syrius
=two=Solaris
=one=East
=two=East
After Crying

Press ENTER or type command to continue
=one=Panta Rhei
=two=Panta Rhei

所以x在后台运行并打印到stdout. 由Press ENTER or type command to continue呈现(当我从启动脚本时)并显示后台进程在主脚本完成后完成其工作。如果您想等到所有后台进程完成您可以使用获取后台进程的 PID 和内置作为最后一个函数。x$!wait <PID>

于 2013-06-26T07:16:55.903 回答
2

对于其他任何一起来的人:

鉴于以下情况:

function par() {
    parallel sh -c ::: "sleep 1" "sleep 1" "sleep 1"
}

function seq() {
    sleep 1
    sleep 1
    sleep 1
}

对这两个命令计时表明第一个函数同时执行,而第二个函数等待每个命令完成,然后再继续执行下一个命令:

$ time par && time seq

real    0m1.215s
user    0m0.147s
sys     0m0.085s

real    0m3.028s
user    0m0.011s
sys     0m0.012s

幸福!

于 2013-06-26T06:35:06.820 回答