2017-08-03 4 views
-1

私はいくつかの機能を持つスクリプトを書いています。 bashスクリプトにはいくつかの関数があります - これはexpectスクリプトを呼び出します。ターミナルで関数をテストすると、うまく動作して完了しますが、スクリプト全体をテストするとハングします。もし私がexpectスクリプトを削除すると、それは終了するでしょうが、それは累積時間で実行され、最長のtime'd関数である6m30.400sの完全な時間を期待するものではありません。bashスクリプトの関数から呼び出されたときにスクリプトが失敗すると考えています

プロセスをバックグラウンドにしてstdoutをビットバケットに送る正しい出力ですか - すべてのプロセスが同時に実行されるようにbackup_ironport &> /dev/nullたとえば、

最初の6つの関数を使ってスクリプトを実行しましたが、2m48秒かかると予想しましたが、4m47秒かかるため、同時に実行するのではなく別々に実行しているようです。

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

私はすべての機能を実行させると、15分以上かけて停止し、停止する必要があります。テストするためにシェル内で別々に関数を実行すると、それが完了します。私は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はここで/dev/nullに、同時にstdoutとstderrの両方をリダイレクトする短手です。

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

屋を持っている:あなたは、関数呼び出しが出力を落とすバックグラウンドにしたい場合は、実際のバックグラウンド化トークンを含める必要が - それは単純なものでした。どうもありがとう –

関連する問題