web-dev-qa-db-fra.com

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 le dernier processus (c'est-à-dire le grep qui a été démarré en même temps que ma commande ps) d'être signalé?

(J'ai commencé à essayer de trouver une expression rationnelle qui correspondrait au littéral mais pas à elle-même, mais cela semblait, euh, pas la bonne approche ...)

53
Steve Bennett

Ma réponse est une variation de la réponse typique pour la recherche de "foobar" dans une liste ps. L'argument de "-A" "ps" est plus portable que "aux", Je crois, mais ce changement est sans rapport avec la réponse. La réponse typique ressemble à ceci:

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

Au lieu de cela, 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 vous concaténez simplement une chaîne statique [^]] avec le motif que vous recherchez. Vous n'avez pas besoin de retirer la première lettre de la chaîne, puis de l'insérer entre les accolades carrées, puis de concaténer à nouveau cette dernière. Lors de l'écriture de scripts dans Shell, il est plus facile de simplement coller [^]] devant le motif que vous cherchiez. Le tranchage de cordes dans Bash est une chose moche, donc ma variation l'évite. Cette variation indique de montrer les lignes où le motif correspond SANS un crochet carré à droite]. Étant donné que le motif de recherche pour exclure un crochet carré ajoute en fait le crochet carré au motif, il ne se correspondra jamais.

Vous pouvez donc écrire une commande portable psgrep comme suit. Ici, je prends en compte les différences entre Linux, OS X BSD et d'autres. Cela ajoute les en-têtes de colonne de ps, fournit un format ps plus personnalisé qui convient à mes besoins et affiche les processus listant extra, extra wide afin qu'aucun des arguments de la ligne de commande ne soit manqué. Eh bien, la plupart ne sont pas manqués. Java étant Java, il fait souvent les choses de la pire façon possible, donc certains services Java exécuteront au-delà de la longueur maximale autorisée d'arguments que la table de processus Je pense qu'il s'agit de 1024 caractères. La longueur de la commande seule autorisée pour démarrer un processus est beaucoup plus longue, mais la table de processus du noyau ne prend pas la peine de garder une trace de plus de 1 Ko. Une fois la commande lancée le nom de la commande et la liste d'arguments ne sont pas nécessaires, donc ce qui est stocké dans la table de 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
}
15
Noah Spurrier

+1 pour la réponse laconique @jamzed, mais l'OP pourrait avoir besoin d'explications:

ps | grep "[d]jango"

En utilisant cette expression régulière, vous lancez un processus auquel sa chaîne ps ne correspondra pas, car l'expression régulière correspond à "Django" et pas "[d]jango". De cette façon, vous excluez le processus qui a 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 que vous avez utilisée pour définir l'expression régulière.

De l'homme 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.
67
hmontoliu

ps | grep [d]jango

ps | grep d[j]ango

...

ps | grep djang[o]

30
jamzed

Utilisez pgrep à la place: pgrep -lf Django

18
ramruma

Oh attendez, cela fonctionne:

ps | grep Django | grep -v grep
11
Steve Bennett

ps -d | grep Django

de man ps:

 -d                  Lists information  about  all  processes
                     except session leaders.
8
blah