bash, php silence erreur de segmentation

je dois empêcher toute sortie php, https://stackoverflow.com/a/617184/1695680 couvre comment faire ceci en général et pour exception, les erreurs, les erreurs de syntaxe jusqu'à présent, il a fonctionné, mais.

php pour produire une segfault dans l'extension pcre: https://ilia.ws/archives/5_Top_10_ways_to_crash_PHP.html

<?php
# prce-bug.php

preg_match('/(.(?!b))*/', str_repeat("a", 10000));

dans mes tests, ça sort toujours:

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)

Donc, même avec la redirection de la sortie shell, la sortie atteint mon terminal.

2
demandé sur Community 2015-09-02 00:42:43

3 réponses

La redirection de sortie

est appliquée au processus, mais le message segfault est généré par bash lui-même à la suite de la mort du processus enfant avec une segfault.

Une solution serait de faire quelque chose comme ceci:

echo `php pcre-bug.php >/dev/null 2>&1`
1
répondu wojtow 2015-09-01 22:51:26

j'ai trouvé que l'utilisation d'une nouvelle instance shell sh permettra de capturer les décès de processus signalés par le système, comme la faille de Segmentation et tué.

sh -c 'php pcre-bug.php' >/dev/null 2>&1

cependant, les arguments d'entrée ne vont pas à php, mais plutôt à l'instance sh qui ne fait rien avec eux.

1
répondu ThorSummoner 2015-09-01 23:48:19

vous pouvez utiliser les commandes composées { } :

$ { php pcre-bug.php; } &>/dev/null
$
$ echo $?
139

à Partir de Bash Manuel -> 3.2.4 Composé de Commandes -> 3.2.4.3 Groupement de Commandes et man bash :

Commandes Composées

{ liste; }

list est simplement exécuté dans l'environnement shell actuel. la liste doit être arrêté avec une nouvelle ligne ou un point-virgule.

c'est ce qu'on appelle un commandement de groupe. Le statut de retour est le statut de sortie de liste. Notez que contrairement à la métacaractères ( et ), { et } sont les mots réservés et doit se produire lorsqu'un mot réservé est autorisé à être reconnaître.

Puisqu'ils ne causent pas de rupture de mot, ils doivent être séparés de la liste par whitespace ou un autre metacharacter shell.

Cependant, en utilisant ( ) ne fonctionne pas et je ne sais pas pourquoi:

$ ( php pcre-bug.php ) &>/dev/null
Segmentation fault (core dumped)
1
répondu fedorqui 2015-09-02 10:34:43