2011-12-26 60 views
2

所以我有這樣的代碼:在Ubuntu Linux操作系統的64位11.10殼上設置的BG任務完成可變

uthreads=4                            
x=1                             

cd ./wxWidgets/wxWidgets/build-win                      

for upxs in $(ls ./lib/*.dll)                       
do                              
    while [ true ] ; do                       
      if [ $x -lt $uthreads ] ; then                   
        x=$((x+1))                      
        (upx -qqq --best --color $upxs; x=$((x-1))) &             
        break                       
      fi                          
      sleep 1                        
    done                           
done                             
x=$((x=1)) 

問題出在變量被修改括號。自然,這不會按預期工作,因爲變量永遠不會被髮送回父shell。所以我的問題是你如何做到這一點?無論退出狀態如何,upx命令完成後,變量都必須遞增。所以一個簡單的& &或||在這裏不起作用。在upx之後你不能在這裏使用單一的&;因爲那時的進程在後臺運行,並立即改變變量...

所以我很有效卡住,可以使用一些幫助...

+0

你或許應該改變'Linux的標題+標籤到任何外殼您正在使用得到一些更好的答案。 – AlexWebr 2011-12-26 07:47:38

回答

0

假設你想「門」活動通過控制它在後臺運行多少個副本來查看程序,查看xargs命令。我的系統沒有安裝upx,所以我可以推薦作爲代碼樣本最好是

uthreads=4                            
cd ./wxWidgets/wxWidgets/build-win 

ls ./lib/*.dll | xargs -I{} -P $uthreads upx -qqq --best --color {} 
^    ^^  ^^    ^
    +>your list   | |   | |     | 
         | |   | |     +> item from your lst 
         | |   | +> your cmd's opts 
         | |   +> your cmd 
         | + xargs opt for # of processes 
         + xargs option to indicate what string to replace with   

使用xargs --help看到所有的選項,man xargs如果你是幸運的使用情況進行深入細節,在網上搜索,並在這裏查看更多用法示例。 wikipedia article是一個好的開始。

我希望這有助於

0

首先,這樣的:while [ true ]是錯誤的,true是一個命令,所以是[你不需要都在這裏只是做while true; do(並使用在bash [[,另一種是僅用於POSIX-sh)。

這樣的:for upxs in $(ls ./lib/*.dll)也是錯誤的,這是比較嚴重的;我給你一些信息鏈接所有的,但現在只是做:for upxs in ./lib/*.dll

另一個重要的錯誤是,你沒有引用您的變量,每一個變量MUST用雙引號,如果有什麼你從這篇文章中學習,請讓它成爲那個。

現在關於你的具體問題的整個做法是錯誤的,你不能做你想要做的,因爲你不知道哪個進程將結束第一什麼,你等待特定的一個或等待所有的他們。

也注意到你正在運行與相同文件四個過程,我相信你的意圖是要並行處理4個不同的文件,你不要等他們要麼完成,機會是你的腳本後,結束你的進程被殺害。

次優,但簡單的解決辦法是有4個進程並行運行,等待他們都開始4個,由這個(這類似於當前的方法)完成前完成:

#!/bin/bash 

uthreads=4 

cd ./wxWidgets/wxWidgets/build-win 
upxs=(lib/*.dll) 

i=0 
while ((i<${#upxs[@]})); do 
    for ((x=0; x<uthreads; x++)); do 
     [[ ${upxs[i+x]} ]] || break 
     upx -qqq --best --color "${upxs[i+x]}" & 
    done 
    i=$((i+x)) 
    wait 
done 

現在,這可能不足以滿足你:)所以方式來實現在任何時間4個正在運行的進程會是這樣(使用的PID):

#!/bin/bash 

uthreads=4 

cd ./wxWidgets/wxWidgets/build-win 
upxs=(lib/*.dll) 

i=0 pids=() 
while [[ ${upxs[i]} ]]; do 
    while ((${#pids[@]}<uthreads)); do 
     upx -qqq --best --color "${upxs[i]}" & pids+=($!) 
     [[ ${upxs[++i]} ]] || break 
    done 
    sleep .1 
    pids=($(for pid in "${pids[@]}"; do kill -0 $pid && echo $pid; done)) 
done 
wait 

現在這裏是我答應的鏈接:

相關問題