Aby 'ps -ef | grep' nevypisoval sám sebe

Kde je problém ?

Příkaz 'ps -ef | grep text' někdy „zlobí“ tím, že nalezne (vypisuje) sám sebe.
Navíc nelze zaručit, že sám sebe vypíše vždy.
A pokud se scriptem kontroluje třeba běžící process, jako například:
ps -ef | grep nmbd
vypíše něco takového (s tím, že druhý řádek někdy(většinou) je a někdy není)
root      2877     1  0 May24 ?        00:00:01 /usr/sbin/nmbd -D -s /etc/samba/smb.conf
root     16439 16058  0 12:45 pts/0    00:00:00 grep nmbd
... což jistě není to pravé ořechové.

Řešení

Lze tomu jednoduše a bezpečně zabránit přídáním [] jako například:
ps -ef | grep n[m]bd
již bezpečně vypíše
root      2877     1  0 May24 ?        00:00:01 /usr/sbin/nmbd -D -s /etc/samba/smb.conf
... a to je již to pravé ořechové.

Vysvětlení k řešení

Vyvětelní je prosté:
Hranaté závorky udávají výčet možných znaků a pokud obsahují jen jeden znak je to jako by tam nebyly – nemají vliv na hledaný výraz.
Ale ve výpise procesů příkaz grep s takovýmto parametrem tyto závorky obsahuje takže nemůže dojít ke shodě – nemůže nalézt sám sebe.
Je jedno, které písmenko bude v hranatých závorkách, důležité je aby bylo jen jedno.

Špatný příklad (s ohledem na zmiňovaný grep)

#! /bin/sh
#spatne reseni - nefunkcni
if  ps -ef | grep -q -e "nmbd";  then
 echo "Already running"
else
 echo "Not running"
fi
Většinou i když 'nmbd' nepoběží vypíše: 'Already running

Správný příklad (s ohledem na zmiňovaný grep)

#! /bin/sh
if  ps -ef | grep -q -e "n[m]bd";  then
 echo "Already running"
else
 echo "Not running"
fi

Zdroje informací: