bonjour à tous,
voila je voulais savoir si on peut voir si un processus a planté, sachant que je n'ai pas le code source mais uniquement l'exécutable. Peut etre via le repertoire /proc mais apres je sais pas trop ou regarder
Merci d'avance pour votre aide
# reponse
Posté par voxdemonix . Évalué à 2. Dernière modification le 27 août 2019 à 18:39.
ps -aux | grep "[n]om_processus"
par exemple
ps -aux | grep "[f]irefox"
Si la commande n'affiche rien, c'est qu'il n'est pas listé dans les processus actif. Ne fonctionne pas avec les rootkit.
Si non tu peux aussi lancer l’exécutable en ligne de commande et voir s'il te renvoie des erreurs voir forcer l'enregistrement des erreurs dans un fichiers en ajoutant
2> /tmp/erreurs.txt
en fin de commande[^] # Re: reponse
Posté par Anonyme . Évalué à 7.
Ou plus simplement
pgrep -laf <nom>
.Sinon, qu’est-ce qu’on entend par planté ? Qui doit vérifier ça ?
Parce que, par exemple, systemd ou Docker peuvent redémarrer automatiquement le processus en cas de code de sortie différent de 0 ou ce genre de chose.
Si le but est de vérifier (en ayant le PID) que le process existe toujours, vérifier la présence de
/proc/<pid>
et vérifier que le processus n’est pas dans un étatZ
(zombie) ouT
(stopped) dans/proc/<pid>/stat
, pourrait aussi faire l’affaire.[^] # Re: reponse
Posté par cosmoff . Évalué à 2.
ok je me suis mal exprimé.
Je veux dire que le processus est bloqué par un dead lock. donc le processus est toujours actif mais il n'avance plus dans ses instructions
[^] # Re: reponse
Posté par fearan . Évalué à 7.
Ah oui coté formulation ça se pose là…
le plus simple c'est d'y attacher un debbugger et voir où il est gdb --pid $(pidof monprocessus), puis pour voir où est le programme la commande bt.
S'il est multi threade (il y de fortes chances vu que tu parles d'étreinte fatale), tu peux itérer sur les thread à l'aide de la commande thread; ou plus simple lancer la même commande sur tous les tread avec thread aplly all commande
Et cerise sur le gâteau, tu peux même le faire en batch :
cela te permet de voir à un instant t où le programme se trouve.
Cette manip peut aussi être utilisé pour voir où un programme passe beaucoup de temps (suffit de le lancer régulièrement et voir où on est) C'est loin d'être aussi précis que des timers un peu partout, mais ça fonctionne sans altérer le code et ne demande pas de mise en place de truc lourds.
Il ne faut pas décorner les boeufs avant d'avoir semé le vent
[^] # Re: reponse
Posté par cosmoff . Évalué à 1. Dernière modification le 28 août 2019 à 15:06.
ok merci beaucoup pour l'info
[^] # Re: reponse
Posté par LaBienPensanceMaTuer . Évalué à 2.
Tu es sévère, pour moi sa formulation de base m'a fait immédiatement pensé à un process "bloqué".
Sinon, une autre méthode, moins fiable mais un chouia moins violente, c'est de surveiller l'évolution des fichiers
/proc/<pid>/stat
ou encorestatm
etio
: tu dumpes dans un coin, tu attends X secondes, tu redumpes et tu compares: si ça diffère entre deux dumps, c'est qu'il se passe des choses. Sinon, c'est qu'il se passe rien.Ex:
~$ cat /proc/20783/stat > /tmp/1
~$ cat /proc/20783/stat > /tmp/2
~$ cat /proc/20783/stat > /tmp/3
~$ cat /proc/20783/stat > /tmp/4
~$ md5sum /tmp/[1-4]
77bfb8fb645744baf6b2f230c21ed3ab /tmp/1
77bfb8fb645744baf6b2f230c21ed3ab /tmp/2
f9d987e43632b72f935a90b8532b163d /tmp/3
f9d987e43632b72f935a90b8532b163d /tmp/4
Après, le risque, c'est que si le soft en question idle (parce qu'en attente d'une entrée quelconque) tu risques de le croire, à tort, planté.
[^] # Re: reponse
Posté par Anonyme . Évalué à 5.
Tu peux essayer avec
strace
de voir les appels systèmes fait par ton programme.[^] # Re: reponse
Posté par LaBienPensanceMaTuer . Évalué à 2.
Si il n'a pas accès aux sources, c'est potentiellement un soft proprio.
Si c'est un soft proprio, il y a potentiellement des protections anti-debug qui empêcheront de l'executer via
strace
:-([^] # Re: reponse
Posté par Anonyme . Évalué à 2.
Je suis curieux. Qu’est-ce qui permettrait à un process de savoir qu’un autre process lit les syscall qu’il fait ?
[^] # Re: reponse
Posté par LaBienPensanceMaTuer . Évalué à 2.
strace
tout commegdb
utiliseptrace()
(manpage)strace
permet à la fois de s'attacher à un processus pour en inspecter l'execution et de savoir, en tant que process si un autre est attaché.Ce pdf semble au premier coup d'oeil intéressant et synthétique pour ce sujet.
# Le mieux ...
Posté par LaBienPensanceMaTuer . Évalué à 2.
… reste de tester le fonctionnel, en fait.
Si c'est un service réseau, connectes y toi et joue un bout du protocole qu'il implémente.
Si c'est un service de traitement de fichier, vérifie que ses sorties sont réellement produites.
Si c'est un service qui consomme/produit quoi que ce soit, trouve un moyen de te mettre entre la source ou la destination pour contrôler qu'il se passe quelque chose.
Dans l'absolu, savoir si un processus est 100% opérant sans controler son travail ou modifier son code est plutôt ardu et les rares méthodes qui existeraient seront quoi qu'il arrive un gros bidouillage possiblement couteux en perf, en temps et pas nécessairement possible.
En vrac: modules kernel pour contrôler au niveau du scheduler, hooks des symboles dynamiques utilisés par le binaire à coup de
LD_PRELOAD
,ptrace
,gdb
,strace
, etc…Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.