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 nmbdvypíš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]bdjiž 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 runningSprá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í:
- man grep
- man ps
- Bash manual