Exec()尽管没有程序中没有循环,但仍像无限循环一样一次又一次地执行命令



附录:下面问题中的问题是 second 命令。当我评论第二个声明时,第一个声明按预期运行并产生预期的结果。:S


我需要同时从php运行两个终端命令,而没有解决我的问题(如您愿意的话,您可以在这里和这里看到(。第一个命令应该运行5秒钟并捕获网络流量(数据包(。第二个命令应该生成一些网络数据包并将其发送。整个想法是,第二个命令生产的网络数据包应由TSHARK捕获,该网络由第一个命令启动。

换句话说,我需要在后台启动tshark,而无需等待它完成,我需要运行第二个命令。

最后,如果我们用 & 结束终端命令,我会在某个地方阅读,该命令是在后台运行,我们可以继续在前景中运行其他命令。我认为这是解决我的问题的方法!

然后我写了以下脚本。

问题:

当我在浏览器中执行此脚本时,网页会继续加载,并且加载永远不会完成。同样,显然,Tshark继续在背景捕获数据包中运行,而不是在5秒后停下来。我之所以这样说是因为数据包不断添加捕获文件(capture.pcapcapture.txt-存储捕获的数据包的文件,请参见脚本中的命令(浏览器。

另外,当我手动停止加载网页并在Wireshark中打开capture.pcap文件时,我看到应该通过第二个命令发送的数据包已发送数百次。

问题:

  1. 这是否意味着两个命令都一次又一次地运行,就像在无限循环中一样?

  2. 脚本中没有循环。那为什么这种无限循环喜欢行为呢?我该如何解决?

脚本:

shell_exec("tshark  -a duration:5  -w /var/www/html/Test/capture.pcap -V > capture.txt &");
shell_exec("./mtu  -d0  -a43020008  -g43010008  -i987654321  -s'Mary'  2>&1");

当我在express.js中的API呼叫上调用exec()时,我也会发生同样的事情。我做错了的是在exec()中打电话给res.send(),这实际上从未停止过。

而不是这样:

router.get('/create-file', function(req, res, next) {
  exec("npm run create-file", (error, stdout, stderr) => {
    if (error) {
      console.log(`error: ${error.message}`);
      return;
    }
    if (stderr) {
      console.log(`stderr: ${stderr}`);
      return;
    }
    console.log(`stdout: ${stdout}`);
    res.send('create file');
  });
  
});

这样做:

router.get('/create-file', function(req, res, next) {
      exec("npm run create-file", (error, stdout, stderr) => {
        if (error) {
          console.log(`error: ${error.message}`);
          return;
        }
        if (stderr) {
          console.log(`stderr: ${stderr}`);
          return;
        }
        console.log(`stdout: ${stdout}`);
        
      });
      res.send('create file');
    });

最新更新