Dans l'environnement Linux, comment envoyer un signal d'arrêt à un processus, tout en m'assurant que le code de sortie renvoyé par ce processus est 0? Dois-je faire de la magie GDB pour cela, ou y a-t-il un signal de mise à mort fantaisiste que je ne connais pas?
Cas de test:
cat; echo $?
killall cat
L'essai de divers signaux d'arrêt ne propose que différents signaux de retour, tels que 129, 137 et 143. Mon objectif est de tuer un processus exécuté par un script, mais de faire croire au script qu'il a réussi.
No symbol table is loaded. Use the "file" command
. Bien que cela soit hautement improbable._exit
appel système avec0
comme argument. Cela fonctionnera sur n'importe quel processus qui ne consiste pas simplement à boucler et à graver des cycles de processeur. Si le processus ne se trouve pas coincé dans une boucle infinie, vous pouvez toujours utiliser la même approche si vous pouvez trouver les instructions nécessaires quelque part dans son exécutable et y pointer le pointeur d'instructions.Non. Lorsque le shell intercepte,
SIGCHLD
il définit inconditionnellement la valeur de retour de manière appropriée à une valeur non nulle, donc cela nécessiterait une modification du script ou du shell.la source
Je ne suis pas sûr, mais cela se terminera par un 0 si l'un des signaux répertoriés est reçu. Vous pouvez effectuer d'autres actions, notamment appeler une fonction, etc.
la source
Ce one-liner a fonctionné pour moi:
la source
$ cat; echo $?
Terminated
143
.Un peu un peu hacky, mais ..
Vous pouvez créer un wrapper pour votre processus, remplaçant le gestionnaire SIGCHLD. Par exemple:
Après cela, vous pouvez faire en sorte que votre script exécute ce wrapper au lieu de votre processus en le plaçant plus tôt dans $ PATH et en renommant le même nom.
la source