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.