Bash 脚本生成多个日志文件。我希望它只生成一个日志文件

Bash 脚本生成多个日志文件。我希望它只生成一个日志文件

我希望脚本在 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>&1stderr 发送到 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如果您不想在常规输出中捕获错误,请再次忽略。

相关内容