从 bash 脚本中的函数调用时期望脚本失败
expect script failing when called from a function in bash script
我写了一个有几个功能的脚本。有几个函数是 bash 脚本 - 调用 expect 脚本。当我在终端中测试该功能时,它 运行 正常并完成 - 但是当我测试我的整个脚本时它挂起。如果我删除 expect 脚本,它将完成,但它是 运行s 的累积时间,而不是我期望的 6m30.400s 的完整时间,这是最长的时间函数。
这是后台进程并将标准输出发送到位桶的正确输出吗 - 这样所有进程都会 运行 同时 backup_ironport &> /dev/null
例如。
我 运行 具有前 6 个函数的脚本,我预计它需要 2 分 48 秒,但它需要 4 分 47 秒 - 这似乎是 运行 分开而不是同时。
time ./network-bak.sh
real 4m47.033s
如果我让它 运行 所有功能它挂起超过 15 分钟,我必须停止它。如果我把运行函数单独放在shell里测试一下就可以完成了。我 运行 bash -x 和脚本,它只是位于第一个 expect 脚本 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 "
&>
syntax 是同时重定向 stdout 和 stderr 的简写,这里是 /dev/null
。如果你想后台函数调用 和 删除输出,你需要包括实际的后台标记:
...
backup_ironport &> /dev/null &
...
我写了一个有几个功能的脚本。有几个函数是 bash 脚本 - 调用 expect 脚本。当我在终端中测试该功能时,它 运行 正常并完成 - 但是当我测试我的整个脚本时它挂起。如果我删除 expect 脚本,它将完成,但它是 运行s 的累积时间,而不是我期望的 6m30.400s 的完整时间,这是最长的时间函数。
这是后台进程并将标准输出发送到位桶的正确输出吗 - 这样所有进程都会 运行 同时 backup_ironport &> /dev/null
例如。
我 运行 具有前 6 个函数的脚本,我预计它需要 2 分 48 秒,但它需要 4 分 47 秒 - 这似乎是 运行 分开而不是同时。
time ./network-bak.sh
real 4m47.033s
如果我让它 运行 所有功能它挂起超过 15 分钟,我必须停止它。如果我把运行函数单独放在shell里测试一下就可以完成了。我 运行 bash -x 和脚本,它只是位于第一个 expect 脚本 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 "
&>
syntax 是同时重定向 stdout 和 stderr 的简写,这里是 /dev/null
。如果你想后台函数调用 和 删除输出,你需要包括实际的后台标记:
...
backup_ironport &> /dev/null &
...