63 votes

Comment empêcher "ps" de signaler son propre processus ?

$ ps | grep django
28006 ttys004    0:01.12 /usr/bin/python bin/django celeryd --beat
51393 ttys005    0:01.45 /usr/bin/python bin/django celeryd -l INFO
51472 ttys005    0:01.29 /usr/bin/python bin/django celeryd -l INFO
51510 ttys005    0:01.89 /usr/bin/python bin/django celeryd -l INFO
51801 ttys005    0:01.83 /usr/bin/python bin/django celeryd -l INFO
53470 ttys005    0:03.97 /usr/bin/python bin/django celeryd -l INFO
53780 ttys005    0:00.00 grep django

Existe-t-il un moyen d'empêcher que le dernier processus (c'est-à-dire le grep qui a été lancé en même temps que ma commande ps) soit signalé ?

(J'ai commencé à essayer de trouver une regex qui correspondrait au littéral mais pas à lui-même, mais cela ne semblait pas être la bonne approche...)

70voto

hmontoliu Points 3633

+1 pour la réponse laconique de @jamzed, cependant le PO pourrait avoir besoin d'une explication :

ps | grep "[d]jango"

En utilisant cette regex, vous lancez un processus dont la chaîne ps ne correspondra pas à elle-même, puisque la regexp correspond à "django" y no "[d]jango" . De cette façon, vous exclurez le processus contenant la chaîne "[d]jango" qui, dans ce cas, est grep. La même chose peut être appliquée à pgrep, egrep, awk, sed, etc... quelle que soit la commande utilisée pour définir la regex.

De la man 7 regex

   A bracket expression is a list of characters enclosed in "[]".  It nor
   mally matches any single character from the list (but see  below).   If
   the  list  begins  with  '^',  it matches any single character (but see
   below) not from the rest of the list.  If two characters  in  the  list
   are  separated  by '-', this is shorthand for the full range of charac
   ters between those two (inclusive) in the collating sequence, for exam
   ple,  "[0-9]" in ASCII matches any decimal digit.  It is illegal(!) for
   two ranges to share an endpoint, for example, "a-c-e".  Ranges are very
   collating-sequence-dependent,  and portable programs should avoid rely
   ing on them.

30voto

ldgriffin Points 111

ps | grep [d]jango

ps | grep d[j]ango

...

ps | grep djang[o]

20voto

Noah Spurrier Points 346

Ma réponse est une variation de la réponse typique pour la recherche de "foobar" dans une base de données. ps liste. L'argument de "-A" "ps" est plus portable que "aux" mais ce changement n'est pas pertinent pour la réponse. La réponse typique ressemble à ceci :

$ ps -A -ww | grep [f]oobar

A la place, j'utilise ce modèle :

$ ps -A -ww | grep [^]]foobar

Le principal avantage est qu'il est plus facile d'écrire des scripts basés sur ces modèles car il suffit de concaténer une chaîne statique. [^]] avec le modèle que vous recherchez. Vous n'avez pas besoin de dépouiller la première lettre de la chaîne de caractères puis de l'insérer entre les crochets et de concaténer à nouveau le tout. Lors de l'écriture de scripts dans Shell, il est plus facile de simplement coller le [^]] devant le modèle que vous cherchiez. Le découpage des cordes dans Bash est une chose hideuse, donc ma variation évite cela. Cette variante dit de montrer les lignes où le motif correspond SANS crochet droit en tête ]. Puisque le modèle de recherche pour exclure un crochet ajoute en fait le crochet au modèle, il ne correspondra jamais lui-même.

Ainsi, vous pourriez écrire un portable psgrep comme suit. Ici, je tiens compte des différences entre Linux, OS X BSD, et autres. Cela ajoute les en-têtes de colonne de ps permet de personnaliser davantage les ps qui convient mieux à mes besoins, et affiche la liste des processus de manière extra, extra large pour qu'aucun des arguments de la ligne de commande ne soit oublié. Eh bien, la plupart ne sont pas manqués. Java étant Java, il fait souvent les choses de la pire façon possible, de sorte que certains services java dépasseront la longueur maximale autorisée des arguments dont la table des processus garde la trace. Je crois que cette longueur est de 1024 caractères. La longueur de la commande seule autorisée pour démarrer un processus est beaucoup plus longue, mais la table des processus du noyau ne prend pas la peine de garder la trace de tout ce qui dépasse 1K de longueur. Une fois que la commande est lancée, le nom de la commande et la liste des arguments ne sont plus nécessaires, donc ce qui est stocké dans la table des processus est juste informatif.

psgrep ()
{
    pattern=[^]]${1};
    case "$(uname -s)" in
        Darwin)
            ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        Linux)
            ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        *)  # other UNIX flavors get a minimalist version.
            ps -A -ww | grep -i -e ${pattern}
        ;;
    esac
}

19voto

Alex B Points 116

Utilisez pgrep à la place : pgrep -lf django

11voto

Steve Bennett Points 5299

Oh attends, ça marche :

ps | grep django | grep -v grep

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X