附录:下面问题中的问题是 second 命令。当我评论第二个声明时,第一个声明按预期运行并产生预期的结果。:S
我需要同时从php运行两个终端命令,而没有解决我的问题(如您愿意的话,您可以在这里和这里看到(。第一个命令应该运行5秒钟并捕获网络流量(数据包(。第二个命令应该生成一些网络数据包并将其发送。整个想法是,第二个命令生产的网络数据包应由TSHARK捕获,该网络由第一个命令启动。
换句话说,我需要在后台启动tshark,而无需等待它完成,我需要运行第二个命令。
最后,如果我们用 &
结束终端命令,我会在某个地方阅读,该命令是在后台运行,我们可以继续在前景中运行其他命令。我认为这是解决我的问题的方法!
然后我写了以下脚本。
问题:
当我在浏览器中执行此脚本时,网页会继续加载,并且加载永远不会完成。同样,显然,Tshark继续在背景捕获数据包中运行,而不是在5秒后停下来。我之所以这样说是因为数据包不断添加捕获文件(capture.pcap
和capture.txt
-存储捕获的数据包的文件,请参见脚本中的命令(浏览器。
另外,当我手动停止加载网页并在Wireshark中打开capture.pcap
文件时,我看到应该通过第二个命令发送的数据包已发送数百次。
问题:
-
这是否意味着两个命令都一次又一次地运行,就像在无限循环中一样?
-
脚本中没有循环。那为什么这种无限循环喜欢行为呢?我该如何解决?
脚本:
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');
});