期望从bash脚本中的函数调用脚本失败

时间:2017-08-03 16:47:14

标签: bash function time expect

我编写了一个包含多个功能的脚本。有几个函数是bash脚本 - 它们调用expect脚本。当我在终端中测试该功能时,它运行正常并完成 - 但是当我测试我的整个脚本时它会挂起。如果我删除了期望脚本,它将完成,但它会运行累积时间而不是我期望的6m30.400s的完整时间,这是最长时间的功能。

这是对进程进行后台处理并将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   "

1 个答案:

答案 0 :(得分:0)

&> syntax是同时重定向stdout和stderr的简写,这里是/dev/null。如果你想要函数调用删除输出,你需要包含实际的背景标记:

...
backup_ironport &> /dev/null &
...