【问题标题】:Why do some of my shell_exec's sometimes fail with a Broken pipe, while still producing the necessary output?为什么我的某些 shell_exec 有时会因管道损坏而失败,但仍会产生必要的输出?
【发布时间】:2019-05-16 04:08:13
【问题描述】:

我编写了一个非常复杂、非常hackjob的PHP-cli脚本,它接收和解析可变结构、深度和内容的JSON。出于这个原因,当时我发现使用 PHP 的 shell_exec()cat | jq | grep 进行解析是最容易的。

有时,很少,在某些输入上它会给我消息Error: writing output failed: Broken pipe,这是我在脚本死亡之前在 cli 输出中看到的最后一条消息。然而,即使它这样做了,数据仍然被正确解析出来,尽管它对我有一点好处。

我将有问题的代码段隔离到:

$jq1='cat '.$randfile.' | jq \'.\' | grep "\[" -m 1 | grep -Po --color=none "\w{3,15}"';

$jq1=trim(shell_exec($jq1));

并尝试通过查看它执行的内容来调试它。第一行是shell_exec参数,执行前回显,第二行是shell_exec的结果。

Command: cat 5ca15f21.json | jq '.' | grep "\[" -m 1 | grep -Po --color=none "\w{3,15}";
Result: standalone
Command: cat 5ca59379.json | jq '.' | grep "\[" -m 1 | grep -Po --color=none "\w{3,15}";
Result: season
Error: writing output failed: Broken pipe
Command: cat 5ca7d271.json | jq '.' | grep "\[" -m 1 | grep -Po --color=none "\w{3,15}";
Result: extended
Command: cat 5ca7d7a8.json | jq '.' | grep "\[" -m 1 | grep -Po --color=none "\w{3,15}";
Result: season

(我已经看到了我懒惰方式的错误,并将重写整个部分,但那时我还年轻,缺乏经验,缺乏耐心。我仍然想了解哪里出了问题。)

  1. 是什么让它有时会这样做?输入始终是 jq 的漂亮打印 JSON,具有不同的结构。

  2. 即使它确实收到了损坏的管道消息,仍然会解析出必要的值并将其存储在变量中。那是什么原因导致它死亡呢?我想知道将来是否有办法让 PHP 忽略 [非致命] 错误并继续执行。

  3. 为什么在 bash 中手动调用时,在 shell_exec 中产生损坏管道错误消息的 shell 命令的行为没有什么不同?破损的管道在哪里,是什么原因造成的?

【问题讨论】:

标签: php bash shell exec


【解决方案1】:

编辑:

如果这是要执行的 bash 命令,则可以消除 cat 命令。我会这样写。

$jq1=grep -Po --color=none "\w{3,15}"|"\[" -m 1 file.txt | jq \'.\';
$jq1=trim(shell_exec($jq1));

我结合了你多余的 grep 命令并将文件添加到 grep 命令中,并且只通过管道传输 jq 命令。

【讨论】:

  • 1.我添加了一个分号来正确结束该行 php 代码,这只是在我准备帖子时添加的。谢谢你。 2 和 3. 我基本上拥有的是 php 代码,它生成一个由 shell_exec 执行的 bash 命令序列,例如,在生成 bash 序列之前填充 $randfile。该代码有效,我不确定如何实施您的建议,以及这如何帮助解决管道损坏问题。
猜你喜欢
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多