Comment savoir quel processus écrit sur STDOUT?

19

J'ai deux instances d'un processus en cours d'exécution. L'un d'entre eux est "FREAKING OUT!" et des erreurs d'impression non stop à STDOUT.

Je veux tuer le processus interrompu mais je dois m'assurer de ne pas terminer le mauvais. Ils ont tous deux été lancés en même temps et en utilisant, topje peux voir qu'ils utilisent tous les deux la même quantité de mémoire et de CPU. Je n'arrive pas à trouver quoi que ce soit qui indique quel processus se comporte mal.

La chose la plus sûre serait de déterminer quel processus / pid écrit dans STDOUT.

Y'a-t'il un quelconque moyen d'y arriver?

TCZ8
la source
1
Écrire sur stdout signifierait écrire dans son descripteur de fichier 1 ((du processus en question) qui peut être quelque chose comme un terminal ou /dev/null). Êtes-vous sûr de ne pas vouloir dire un fichier particulier à la place (comme un périphérique terminal ou un fichier journal ...)?
Stéphane Chazelas
S'ils ont tous deux démarré dans le même shell, ils écrivent tous les deux dans STDOUT, donc l'épingler ne vous aidera pas à identifier lequel des 2 tuer. La méthode de Jofel est probablement ce que vous recherchez.
slm
Ce qu'il veut vraiment dire, c'est lequel produit la sortie sur le terminal .
Barmar

Réponses:

17

Sous Linux, en supposant que vous vouliez savoir ce qui écrit dans la même ressource que la sortie standard de votre shell, vous pouvez faire:

strace -fe write $(lsof -t "/proc/$$/fd/1" | sed 's/^/-p/')

Cela signale les write()appels système (sur n'importe quel descripteur de fichier) de chaque processus qui a au moins un descripteur de fichier ouvert sur le même fichier que fd 1 de votre shell.

Stéphane Chazelas
la source
C'est ce que j'avais en tête au départ, je vais essayer les deux méthodes grâce à vous deux.
TCZ8
23

Vous pouvez arrêter les deux traitements en leur envoyant SIGSTOP (remplacez pid1 et pid2 par les PID réels ou utilisez killallet le nom de l'application):

kill -SIGSTOP pid1 pid2

L'impression sur le terminal (ou là où la sortie standard est redirigée) doit s'arrêter. Continuez ensuite l'un d'eux en utilisant

kill -SIGCONT pid1

Si les messages d'erreur apparaissent immédiatement, vous savez que c'est le premier processus. Sinon, vous pouvez l'arrêter à nouveau et continuer la seconde ...

Avant de tuer un processus arrêté, il est recommandé d'envoyer d'abord SIGCONT.

La même technique peut être utilisée avec Ctrl-Zet les commandes d'emploi du shell ( fg %1, bg %1, kill %1, ...).

jofel
la source
1
C'est un très bon moyen de le résoudre, mais je cherchais vraiment un moyen de retracer qui écrit sur le terminal. Merci
TCZ8
Je venais de relire cette question, il semble que j'ai eu un pet de cerveau en écrivant mon dernier commentaire. Cela résoudrait également mon problème. THX.
TCZ8