Почему некоторые из моих shell_exec иногда терпят неудачу с Broken pipe, но все еще выдают необходимый вывод? - PullRequest
0 голосов
/ 16 мая 2019

Я написал очень сложный, очень хакерский скрипт 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. Что заставило бы это сделать это?иногда?На входе всегда печатается JSON JSON с разной структурой.

  2. Даже если получено сообщение о разрыве канала, необходимое значение все равно анализируется и сохраняется в переменной.Что заставляет его умереть тогда?Я хотел бы знать на будущее, есть ли способ заставить PHP игнорировать [нефатальную] ошибку и продолжать выполнять.

  3. Почему команда оболочки, которая создает сломанный каналсообщение об ошибке в shell_exec ведет себя не иначе, когда вызывается вручную в bash?Где сломанная труба и что делает ее такой сломанной?

1 Ответ

0 голосов
/ 16 мая 2019

Редактировать:

Команда cat может быть удалена, если это команда bash, которую нужно выполнить.Я бы написал так:

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

Я объединил ваши избыточные команды grep и добавил файл в команду grep и только передал команду jq.

...