Мне нужно, чтобы предотвратить все выход PHP, https://stackoverflow.com/a/617184/1695680 описывает, как это сделать в целом и, за исключением ошибок, синтаксических ошибок, пока это работает, но.
php для создания ошибки в расширении pcre:
https://ilia.ws/archives/5_Top_10_ways_to_crash_PHP.html
<?php
# prce-bug.php
preg_match('/(.(?!b))*/', str_repeat("a", 10000));
В моем тестировании это все еще выводит:
user@host ~/crash-php $ php pcre-bug.php
Segmentation fault (core dumped)
user@host ~/crash-php $ php pcre-bug.php >/dev/null 2>&1
Segmentation fault (core dumped)
Таким образом, даже с перенаправлением вывода оболочки вывод поступает на мой терминал.
Перенаправление вывода применяется к процессу, однако сообщение segfault генерируется самим bash в результате смерти дочернего процесса с segfault.
Одним из решений было бы сделать что-то вроде этого:
echo `php pcre-bug.php >/dev/null 2>&1`
Я обнаружил, что используя новый sh
Экземпляр оболочки будет регистрировать системные смерти, о которых сообщалось, например, Segmentation Fault и Killed.
sh -c 'php pcre-bug.php' >/dev/null 2>&1
Однако входные аргументы идут не в php, а в экземпляр sh, который ничего с ними не делает.
Вы можете использовать составные команды { }
:
$ { php pcre-bug.php; } &>/dev/null
$
$ echo $?
139
От Руководство по Bash -> 3.2.4 Составные команды -> 3.2.4.3 Группировка команд а также man bash
:
Составные команды
{список; }
Список просто выполняется в текущей среде оболочки. список должен быть
завершается новой строкой или точкой с запятой.Это известно как групповая команда. Статус возврата — это статус выхода
из списка. Обратите внимание, что в отличие от метасимволов (и), {и}
зарезервированные слова и должны встречаться, когда зарезервированное слово разрешено
распознан.Поскольку они не вызывают разрыв слова, они должны быть отделены от списка
пробелом или другим метасимволом оболочки.
Однако, используя ( )
не работает, и я не знаю почему:
$ ( php pcre-bug.php ) &>/dev/null
Segmentation fault (core dumped)