Debugging shell脚本执行序列

Debugging shell脚本执行序列,debugging,shell,Debugging,Shell,我正在调试一个shell脚本 所以我在开头加上set-x 代码片段如下所示 tcpdump -i $interface host $ip_addr and 'port 80' -w flash/flash.pcap & sudo -u esolve firefox /tor_capture/flash.html & sleep $capture_time 但是我注意到执行顺序如下 ++ sleep 5 ++ sudo -u esolve firefox /tor_capture

我正在调试一个shell脚本 所以我在开头加上set-x 代码片段如下所示

tcpdump -i $interface host $ip_addr and 'port 80' -w flash/flash.pcap &
sudo -u esolve firefox /tor_capture/flash.html &
sleep $capture_time
但是我注意到执行顺序如下

++ sleep 5
++ sudo -u esolve firefox /tor_capture/flash.html
++ tcpdump -i eth0 host 138.96.192.56 and 'port 80' -w flash/flash.pcap
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
因此,执行序列与脚本中的命令序列相反 这有什么问题,如何处理?
谢谢

是否需要前两行作为后台进程运行


如果没有,请删除结尾处的
&
,然后重试。

是否需要前两行作为后台进程运行


如果没有,请删除结尾处的
&
,然后重试。

由于这些行是背景行,我认为
set-x
的输出来自运行程序所生成的子shell,在子shell开始生成输出之前,主shell进入
sleep
命令。这就解释了为什么首先显示
sleep
命令。至于另外两个,我想你可能偶尔也会以另一种顺序得到它们,因为它们之间没有同步-取决于你有多少CPU,系统有多忙,等等,子shell之间的时间是伪不确定的…

因为这些行是以后台为基础的,我认为,
set-x
的输出来自生成用于运行程序的子shell,主shell在子shell开始生成输出之前到达
sleep
命令。这就解释了为什么首先显示
sleep
命令。至于另外两个,我想你可能偶尔也会以另一种顺序得到它们,因为它们之间没有同步-取决于你有多少CPU,系统有多忙,等等,子shell之间的时间是伪不确定的…

我需要它们作为后台进程运行,因为我需要捕获数据包一段时间,然后杀死这些tcpdump和firefox我需要它们作为后台进程运行,因为我需要捕获数据包一段时间,然后在shell脚本中杀死这些tcpdump和firefoxso。我如何才能使这三个命令按照我指定的顺序运行?它们是按照您指定的顺序启动的。他们只是没有达到以同样的顺序记录事实的程度。这是在后台/同时运行事物的固有特性。。。例如,如果您需要保证在启动
firefox
之前,
tcpdump
已完全初始化,请在两者之间插入一些
sleep 5
行或其他内容……那么在shell脚本中,如何使这三个命令按我指定的顺序运行?它们是按您指定的顺序启动的。他们只是没有达到以同样的顺序记录事实的程度。这是在后台/同时运行事物的固有特性。。。例如,如果您需要保证在启动
firefox
之前,
tcpdump
已完全初始化,请在两者之间放置一些
sleep 5
行或其他内容。。。