2017-08-03 160 views
-1

我已經編寫了一個具有多個函數的腳本。有幾個函數是bash腳本 - 它調用期望腳本。當我在終端中測試函數時,它運行良好並完成 - 但是當我測試整個腳本時,它會掛起。如果我刪除期望腳本,它將完成,但它會累計時間,而不是我期望的完成時間爲6m30.400s這是最長時間的函數。從bash腳本中的函數調用期望腳本失敗

這是正確的輸出,用於後臺進程並將stdout發送到位桶 - 這樣所有進程將同時運行backup_ironport &> /dev/null例如,

我運行了前6個函數的腳本,我預計它需要2分48秒,但它花了4分47秒 - 這似乎是分別運行它們,而不是同時運行。

time ./network-bak.sh 
real 4m47.033s 

如果我讓它運行所有功能它掛起超過15分鐘,我必須停止它。如果我在shell中單獨運行函數來測試它會完成。我運行了bash -x和腳本,它只是坐在第一個期望腳本backup_cisco_firewall上,並且不在哪裏。

如果我檢查過程中系統:it sits there forever

ps aux |grep fw-bak-expect 
    user 30925 0.0 0.0  0  0 pts/7 Z 10:18 0:00 [fw-bak-  expect.s] <defunct> 

這裏的腳本和運行過程中的功能,可謂物美價廉:我在終端與時間的函數測試每個功能 - 並把真正的使用#標記旁邊的時間來顯示運行需要多長時間。

backup_fortigate() 
{ for fortigate in `cat "$h5"`; do scp $fortigate:sys_config  "$b3"/$fortigate-$date; done; } 

backup_cisco_firewall() 
{ cd "$sc" ; for fw in `cat "$h2"`; do ./fw-bak-expect.sh $fw ; done; } 

######################## 
# Start of MAIN  # 
# First Run the Backups# 
######################## 
rotate & 
rpid=$! 
backup_ironport &> /dev/null # real 0m27.490s 
backup_fortigate &> /dev/null # real 0m40.816s 
backup_nexus &> /dev/null # real 0m35.346s 
backup_switch-router &> /dev/null # real 2m48.649s 
backup_rsa &> /dev/null # real 0m1.017s 
backup_tlite &> /dev/null # real 0m29.589s 
backup_cisco_firewall &> /dev/null # real 6m30.400s # no sys-context 
backup_sw-no-pk &> /dev/null # real 4m6.729s 
backup_esx &> /dev/null # real 1m24.330s 
wait 

############################## 
# Now we confirm the backups # 
############################## 

confirm_backup > /dev/null 
search_for_backups > /dev/null 
vh1=$(wc -l < "$f1") 
vh2=$(wc -l < "$f2") 
backup_verify 
# zero the verification files for the next run 
cat /dev/null > "$f1" 
cat /dev/null > "$f2" 
cat /dev/null > "$mh" 
kill -9 $rpid 
echo "\b\b " 
+0

似乎一旦我刪除>的/ dev/null的做工精細,只是有它的功能與 –

回答

0

&> syntax是短手同時stdout和重定向標準錯誤,這裏/dev/null。如果你想背景函數調用下降的輸出,你需要包含實際backgrounding令牌:

... 
backup_ironport &> /dev/null & 
... 
+0

雅 - 哇,這很簡單。非常感謝 –