2014-04-08 135 views
0

我想打一個bash腳本,將同時執行大約30個左右的其他腳本,這些腳本30都wget命令通過一些列表迭代。從一個腳本中同時執行幾個bash腳本?

我想這樣做與屏幕的東西(發送Ctrl + Shift + A + d)或發送腳本背景,但我真的不知道該怎麼做。

總結:1個主站腳本執行會引發其他所有30個腳本在同一時間執行所有。

PS:我見過的其他問題,但我不太瞭解工作或怎麼比我需要的東西多一點(期望返回值等)

編輯: 小片段腳本(這部分是與我指定的配置PARAMS執行一個)

if [ $WP_RANGE_STOP -gt 0 ]; then 
    #WP RANGE 
    for ((count= "$WP_RANGE_START"; count< "$WP_RANGE_STOP"+1; count=count+1)); 
    do 
     if cat downloaded.txt | grep "$count" >/dev/null 
     then 
      echo "File already downloaded!" 
     else 
      echo $count >> downloaded.txt 
      wget --keep-session-cookies --load-cookies=cookies.txt --referer=server.com http://server.com/wallpaper/$count 
      cat $count | egrep -o "http://wallpapers.*(png|jpg|gif)" | wget --keep-session-cookies --load-cookies=cookies.txt --referer=http://server.com/wallpaper/$number -i - 
      rm $count 
     fi 

回答

2

可能是最簡單的方法是使用xargs -PGNU parallel。在主腳本中爲每個孩子生成不同的參數。爲了簡單起見,假設您只想一次下載大量不同的內容。

xargs -P 30 wget < urls_file 
parallel -j 30 wget '{}' < urls_file 

將產生多達30個併發wget進程,其中來自給定輸入的不同參數。如果您提供有關您想運行的腳本的更多信息,我可能會提供更具體的示例。

並行相比具有xargs一些更復雜的優化選項,如自動分割在覈或CPU作業的能力。

如果你只是想經營一堆並行異構不同的bash腳本的,在自己的文件中定義每個單獨的腳本,然後使每個可執行文件並將其傳遞到並行:

$ cat list_of_scripts 
/path/to/script1 arg1 arg2 
/path/to/script2 -o=5 --beer arg3 
… 
/path/to/scriptN 

然後

parallel -j 30 < list_of_scripts 
+0

劇本是600線長,我會看看我能砍碎了一點,所以我可以在這裏發佈的,還有的配置參數的問題,劇本有幾個配置參數。 – user3084450

+0

@kojiro我加了sctipt的一部分,所以你可以看到它,我真的不能,因爲所有30個腳本不同,這裏使用並行。 – user3084450

+0

@ user3084450如果所有腳本都不同,那就好了。考慮:對於我在{0..10}中; do printf'sleep%d; echo%d \ n'$((i - (i%2)))$ i;完成|並行「 - 我所說的是,如果沒有命令運行,並行運行標準輸入的每一行,就好像它被連接到sh。 – kojiro