我希望脚本在 1 次迭代后结束。看起来它一直在循环,我不得不用 CTR C 杀死它。不知道如何修复它。
[root@vPAS-Calipers lattice_private]# cat stat.sh
#!/bin/bash
DATE=`/bin/date +"%Y%m%d%H%M"`
#140 Caliper VM- Volte
sleep 2
./linux_machine_cli_firing.exp 172.9.9.14 "cd /root/cal/Product/run" "./cli -p 4001 " "show call-mode statistics"
sleep 2
./linux_machine_cli_firing.exp 172.9.9.14 "cd /root/cal/Product/run" "./cli -p 4002 " "show call-mode statistics"
sleep 2
./linux_machine_cli_firing.exp 172.9.9.14 "cd /root/cal/Product/run" "./cli -p 4003 " "show call-mode statistics"
sleep 2
./stat.sh > stat-tps_${DATE}.txt
结果
stat-tps_202101271452.txt
stat-tps_202101271453.txt
stat-tps_202101271455.txt
答案1
这是因为脚本的最后一行:
./stat.sh > stat-tps_${DATE}.txt
这将运行脚本再次输出重定向到新文件。 (当脚本再次运行时,它将通过再次运行自身来完成,等等)。
我想您的意图是将./linux_machine_cli_firing.exp
命令的输出重定向到日志文件中?如果是这样,您可能还想记录 stderr。您可以为每个命令单独重定向它们:
#!/bin/bash
date=$(/bin/date +"%Y%m%d%H%M")
#140 Caliper VM- Volte
sleep 2
./linux_machine_cli_firing.exp 172.9.9.14 "cd /root/cal/Product/run" "./cli -p 4001 " "show call-mode statistics" >"stat-tps_${date}.txt" 2>&1
sleep 2
./linux_machine_cli_firing.exp 172.9.9.14 "cd /root/cal/Product/run" "./cli -p 4002 " "show call-mode statistics" >>"stat-tps_${date}.txt" 2>&1
sleep 2
./linux_machine_cli_firing.exp 172.9.9.14 "cd /root/cal/Product/run" "./cli -p 4003 " "show call-mode statistics" >>"stat-tps_${date}.txt" 2>&1
sleep 2
请注意,第一个用于>
创建新文件,其余的用于>>
附加到文件,而不是覆盖它。将2>&1
stderr 发送到 stdout 所在的同一位置,因此如果您不想捕获错误,请忽略它。
另外,我改用了小写date
变量;有一堆全大写的变量名具有特殊含义,因此使用小写或混合大小写的名称以避免冲突是最安全的。我用双引号引用了文件名,因为它包含变量引用(这里实际上不需要,但良好的脚本编写卫生)。最后,我从使用反引号改为使用清理器$()
来捕获 date 命令的输出。
另一种选择是在脚本运行时将其所有输出重定向到日志文件。您无需使用该命令再次运行脚本即可执行此操作exec
。请注意,您必须执行此操作前运行您想要重定向其输出的命令:
#!/bin/bash
date=$(/bin/date +"%Y%m%d%H%M")
exec >"stat-tps_${date}.txt" 2>&1 # Redirect output from this point on
#140 Caliper VM- Volte
sleep 2
./linux_machine_cli_firing.exp 172.9.9.14 "cd /root/cal/Product/run" "./cli -p 4001 " "show call-mode statistics"
sleep 2
...
2>&1
如果您不想在常规输出中捕获错误,请再次忽略。