GNU/Linux >> Tutoriels Linux >  >> Linux

Comment afficher la sortie d'un processus en cours d'exécution dans une autre session Bash ?

J'ai laissé un script en cours d'exécution sur une machine distante à partir du moment où je travaillais localement dessus. Je peux me connecter via SSH à la machine en tant que même utilisateur et voir le script s'exécuter dans ps .

$ ps aux | grep ipcheck
myuser  18386  0.0  0.0  18460  3476 pts/0    S+   Dec14   1:11 /bin/bash ./ipchecker.sh

Il sort simplement sur stdout sur une session locale (j'ai exécuté ./ipchecker.sh forment une fenêtre de terminal local, pas de redirection, pas d'utilisation de screen etc.).

Est-il possible, depuis une session SSH, d'afficher la sortie de cette commande en cours d'exécution (sans l'arrêter) ?

Jusqu'à présent, le mieux que j'ai trouvé est d'utiliser strace -p 18386 mais je reçois des hordes de texte volant sur l'écran, c'est beaucoup trop détaillé. Je peux arrêter strace puis passer au crible la sortie et trouver le texte imprimé sur stdout mais c'est très long et déroutant, et évidemment pendant qu'il est arrêté, je pourrais manquer quelque chose. J'aimerais trouver un moyen de voir la sortie du script en direct comme si je travaillais localement.

Quelqu'un peut-il améliorer cela? La réponse évidente est de redémarrer le script avec redirection ou dans un screen session, etc., ce n'est pas un script critique pour la mission, donc je pourrais le faire. Je vois plutôt cela comme un exercice d'apprentissage amusant.

Réponse acceptée :

Si tout ce que vous voulez faire est d'espionner le processus existant, vous pouvez utiliser strace -p1234 -s9999 -e write où 1234 est l'ID du processus. (-s9999 évite d'avoir des chaînes tronquées à 32 caractères, et write l'appel système qui produit la sortie.) Si vous souhaitez afficher uniquement les données écrites sur un descripteur de fichier particulier, vous pouvez utiliser quelque chose comme strace -p1234 -e trace= -e write=3 pour voir uniquement les données écrites dans le descripteur de fichier 3 (-e trace= empêche la journalisation des appels système). Cela ne vous donnera pas une sortie qui a déjà été produite.

Si la sortie défile trop rapidement, vous pouvez la rediriger vers un téléavertisseur tel que less , ou envoyez-le dans un fichier avec strace -o trace.log … .

Avec de nombreux programmes, vous pouvez détourner la sortie ultérieure avec un hack ptrace, soit vers votre terminal actuel, soit vers une nouvelle session d'écran. Voir Comment puis-je désavouer un processus en cours d'exécution et l'associer à un nouveau shell d'écran ? et d'autres fils liés.

Notez que selon la configuration de votre système, vous devrez peut-être exécuter tous ces strace commandes en tant que root même si le processus s'exécute sous votre utilisateur sans privilèges supplémentaires. (Si le processus s'exécute en tant qu'utilisateur différent ou est setuid ou setgid, vous devrez exécuter strace en tant que root.) La plupart des distributions autorisent uniquement un processus à tracer ses enfants (cela offre un avantage de sécurité modéré : il empêche certaines injections directes de logiciels malveillants, mais n'empêche pas l'injection indirecte en modifiant les fichiers). Ceci est contrôlé par le kernel.yama.ptrace_scome sysctl.

En relation :Comment gagner le jeu des opérations cloud avec l'automatisation de Kubernetes et réduire les coûts dans le processus
Linux
  1. Comment changer la redirection de sortie d'un processus en cours d'exécution ?

  2. Comment personnaliser Bash Autocomplete pour lister les fichiers dans un autre répertoire ?

  3. Comment rediriger la sortie d'un processus déjà en cours d'exécution

  4. Comment puis-je maintenir un processus en vie après la fermeture de la session de mastic ?

  5. Comment puis-je connaître le chemin absolu d'un processus en cours d'exécution ?

Comment utiliser la commande de lecture Bash

Comment répertorier les processus en cours d'exécution sous Linux

Reptyr - Déplacer un processus en cours d'exécution d'un terminal à un autre sans le fermer

Comment augmenter le tampon de défilement dans une session d'écran en cours d'exécution ?

Comment détacher une session ssh sans tuer un processus en cours d'exécution ?

Comment puis-je obtenir l'heure de l'horloge murale d'un processus en cours d'exécution ?