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.
3 réponses
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`
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.
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)