Gyakori problema, hogy a ps | grep hasznalatakor a grep sajat magat is megtalalja, es azt kulon ki kell venni a kimenetbol. (A problema sed-del, awk-val es a tobbi szurovel is fennall.) Raadasul nem is minden esetben talalja meg sajat magat.
$ ps -ef | grep syncd
vagy
$ ps -ef | sed -n '/syncd/!d;p'
Ennek elkerulesere az alabbi megoldasok kinalkoznak, sorban a legjobb fele haladva:
'3rd party' lsof: Az lsof -t (terse output) csak a PID-eket adja vissza, illetve itt regexp is hasznalhato, csak sajna a slash-ekkel nem tud mit kezdeni. Arrol nem is beszelve, hogy lsof nincs mindenhol (pl AIX-en nincs a default telepitesben), illetve nehany rendszeren sima user nem futtathatja.
$ lsof -t -c syncd
Temp file hasznalata: megoldja a problemat, barmivel feldolgozhato, de igenytelen is...
$ ps -ef > /tmp/psef_$(date +%s)
Trivialis shell megoldas a grep dupla elofordulasara:
$ ps -ef | while read line; do grep syncd; done
A legtokeletesebb megoldas a pgrep lenne, ami nem kenyes a slash-ekre, a teljes process cmdline-t tudja hasznalni, a kapott PID-del meg mar azt kezdunk, amit akarunk, de sajnos AIX-en ez elerhetetlen:
$ pgrep dhcp | xargs ps -o pid=,comm=
Es itt a tuti befuto:
$ ps -ef | grep [s]yncd
A regexp tartomany pontosan egy karakterre illeszkedik, de mivel a process tree-ben a grep argumentumaiban mar szerepel a szogletes zarojel is, ezert az nem illeszkedik a mintara... Raadasul ez viszonylag gyorsan is hasznalhato, tovabbi pipe-ok hasznalata nelkul.