GNU/Linux >> Tutoriels Linux >  >> Linux

Rediriger STDERR / STDOUT d'un processus APRÈS son démarrage, en utilisant la ligne de commande ?

À moins de fermer et de rouvrir votre tty (c'est-à-dire de vous déconnecter et de vous reconnecter, ce qui peut également mettre fin à certains de vos processus d'arrière-plan dans le processus), il ne vous reste qu'un seul choix :

  • attachez-vous au processus en question à l'aide de gdb, et exécutez :
    • p dup2(open("/dev/null", 0), 1)
    • p dup2(open("/dev/null", 0), 2)
    • détacher
    • quitter

par exemple :

$ tail -f /var/log/lastlog &
[1] 5636

$ ls -l /proc/5636/fd
total 0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 0 -> /dev/pts/0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 1 -> /dev/pts/0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 2 -> /dev/pts/0
lr-x------ 1 myuser myuser 64 Feb 27 07:36 3 -> /var/log/lastlog

$ gdb -p 5636
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Attaching to process 5636
Reading symbols from /usr/bin/tail...(no debugging symbols found)...done.
Reading symbols from /lib/librt.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/librt.so.1
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/libpthread.so.0...(no debugging symbols found)...done.
[Thread debugging using libthread_db enabled]
[New Thread 0x7f3c8f5a66e0 (LWP 5636)]
Loaded symbols for /lib/libpthread.so.0
Reading symbols from /lib/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2

(no debugging symbols found)
0x00007f3c8eec7b50 in nanosleep () from /lib/libc.so.6

(gdb) p dup2(open("/dev/null",0),1)
[Switching to Thread 0x7f3c8f5a66e0 (LWP 5636)]
$1 = 1

(gdb) p dup2(open("/dev/null",0),2)
$2 = 2

(gdb) detach
Detaching from program: /usr/bin/tail, process 5636

(gdb) quit

$ ls -l /proc/5636/fd
total 0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 0 -> /dev/pts/0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 1 -> /dev/null
lrwx------ 1 myuser myuser 64 Feb 27 07:36 2 -> /dev/null
lr-x------ 1 myuser myuser 64 Feb 27 07:36 3 -> /var/log/lastlog
lr-x------ 1 myuser myuser 64 Feb 27 07:36 4 -> /dev/null
lr-x------ 1 myuser myuser 64 Feb 27 07:36 5 -> /dev/null

Vous pouvez également envisager :

  • en utilisant screen; screen fournit plusieurs TTY virtuels entre lesquels vous pouvez basculer sans avoir à ouvrir de nouvelles sessions SSH/telnet/etc,
  • en utilisant nohup; cela vous permet de fermer et de rouvrir votre session sans perdre aucun processus d'arrière-plan dans le... processus.

Cela fera :

strace -ewrite -p $PID

Ce n'est pas si propre (affiche des lignes comme :write(#,<text you want to see>) ), mais fonctionne !

Vous pourriez également ne pas aimer le fait que les arguments soient abrégés. Pour contrôler cela, utilisez le -s paramètre qui définit la longueur maximale des chaînes affichées.

Il capture tous les flux, vous pouvez donc les filtrer d'une manière ou d'une autre :

strace -ewrite -p $PID 2>&1 | grep "write(1" 

affiche uniquement les appels du descripteur 1. 2>&1 est de rediriger STDERR vers STDOUT, comme strace écrit dans STDERR par défaut.


riffant l'excellente recherche de vladr (et d'autres):

créez les deux fichiers suivants dans le même répertoire, quelque chose dans votre chemin, dites $HOME/bin :

silence.gdb, contenant (d'après la réponse de vladr):


p dup2(open("/dev/null",0),1)
p dup2(open("/dev/null",0),2)
detach
quit

et silence, contenant :


#!/bin/sh
if [ "$0" -a "$1" ]; then
 gdb -p $1 -x $0.gdb
else
 echo Must specify PID of process to silence >&2
fi

chmod +x ~/bin/silence  # make the script executable

Maintenant, la prochaine fois que vous oubliez de rediriger Firefox, par exemple, et que votre terminal commence à être encombré par les inévitables messages "(firefox-bin:5117):Gdk-WARNING **:XID collision, trouble ahead" :


ps  # look for process xulrunner-stub (in this case we saw the PID in the error above)
silence 5117  # run the script, using PID we found

Vous pouvez également rediriger la sortie de gdb vers /dev/null si vous ne voulez pas la voir.


Linux
  1. Comment redémarrer Linux en utilisant la ligne de commande

  2. Désinstaller Node.JS à l'aide de la ligne de commande Linux ?

  3. Rediriger toutes les sorties vers un fichier dans Bash

  4. Comment rediriger stderr et stdout vers différents fichiers dans la même ligne de script ?

  5. Définir l'heure relative à l'aide de la ligne de commande

Comment créer un fichier sous Linux à l'aide d'un terminal/ligne de commande

Comment rediriger stderr vers stdout dans Bash

Apprenez à connaître votre système (en utilisant la ligne de commande)

Comment créer une base de données dans MySQL à l'aide de la ligne de commande

Comment tester la vitesse d'Internet en utilisant la ligne de commande sous Linux

Comment tuer un processus sous Linux en utilisant la commande ?