Bash 在循环中运行tcpdump

Bash 在循环中运行tcpdump,bash,tcpdump,Bash,Tcpdump,我想运行一个脚本,使用tcpdump和ping从服务器捕获流量 我希望它启动tcpdump、暂停、ping-an端点、睡眠X秒,然后重复该过程。但我希望它在每次ping之间启动和停止tcpdump。我原以为下面的代码可以工作,但它在一次ping后跳出了循环 你知道为什么吗 #!/bin/bash #start a process in the background (it happens to be a TCP HTTP sniffer on the loopback interface,

我想运行一个脚本,使用tcpdump和ping从服务器捕获流量

我希望它启动tcpdump、暂停、ping-an端点、睡眠X秒,然后重复该过程。但我希望它在每次ping之间启动和停止tcpdump。我原以为下面的代码可以工作,但它在一次ping后跳出了循环

你知道为什么吗

#!/bin/bash

#start a process in the background (it happens to be a TCP HTTP sniffer on  the loopback interface, for my apache server):

for i in {1...4}
do
        tcpdump host 8.8.8.8  -ttt &
        sleep 1
        ping -I eth0 8.8.8.8 -c 1

        #.....other commands that send packets to tcpdump.....
        sleep 1
        pkill tcpdump
done

问题在于你的射程-你有一个额外的周期。因此,您只需使用字符串
{1…4}
而不是
1234
循环一次

您可以将代码编写为:

#!/bin/bash
for i in {1..4}
do
  tcpdump host 8.8.8.8 -ttt &
  sleep 1
  ping -I eth0 8.8.8.8 -c 1
  sleep 1
  kill "$!"                      # kill the background process
done

问题在于你的射程-你有一个额外的周期。因此,您只需使用字符串
{1…4}
而不是
1234
循环一次

您可以将代码编写为:

#!/bin/bash
for i in {1..4}
do
  tcpdump host 8.8.8.8 -ttt &
  sleep 1
  ping -I eth0 8.8.8.8 -c 1
  sleep 1
  kill "$!"                      # kill the background process
done

pgrep
已搜索流程列表,无需将流程列表导入其中。另外,您可以使用
pkill
而不是从一个示例中获得这个概念,感谢您提供的指针,我将根据您的建议进行更改。我仍然不明白为什么它只执行一次ping,然后退出,并且不会循环4次?
pgrep
已经搜索了流程列表,无需将流程列表导入其中。另外,您可以使用
pkill
而不是从一个例子中得到这个概念,感谢我在您的建议中修改的指针,我仍然不理解为什么它只执行一次ping,然后退出,并且不循环4次?即使{1..4}也无法工作,但是{1 2 3 4}是吗?如果我们添加代码在tcpdump和kill步骤之间创建另一个后台进程,那么在后台处理之后立即获取PID不是更好吗?DevilWAH,您是否有可能使用
sh yourscript
运行此操作?如果是,则忽略
#/bin/bash
shebang,因此不能使用bash扩展,如
{1..4}
@DevilWAH,…尝试添加一行,如
echo“Running capture$i”>&2
;如果它说
运行capture{1..4}
,那么您知道brace expansion不受欢迎,这几乎肯定意味着它是使用基线POSIX shell解释器而不是bash运行的。尝试使用“sudo bash Scriptname”运行它,是的,这起到了作用,似乎我在文件顶部有一个空行,所以它没有看到shebang。抱歉,现在所有工作都正常,即使{1..4}不工作,但是{1 2 3 4}工作了?在后台工作后立即获取PID不是更好吗?这样代码就可以灵活地终止一个不相关的进程-以防我们添加代码在tcpdump和kill步骤之间创建另一个后台进程?@DevilWAH,您是否有可能使用
sh您的脚本
运行此程序?如果是,则忽略
#/bin/bash
shebang,因此不能使用bash扩展,如
{1..4}
@DevilWAH,…尝试添加一行,如
echo“Running capture$i”>&2
;如果它说
运行capture{1..4}
,那么您知道brace expansion不受欢迎,这几乎肯定意味着它是使用基线POSIX shell解释器而不是bash运行的。尝试使用“sudo bash Scriptname”运行它,是的,这起到了作用,似乎我在文件顶部有一个空行,所以它没有看到shebang。抱歉,现在一切正常