2016-03-08 32 views
3

腳本:桑達發現自己和擺脫腳本結果

#!/bin/bash 

SERVICE="$1" 
RESULT=`ps -a | sed -n /${SERVICE}/p` 
MEM=$(ps aux | sort -rk +4 | grep $1 | grep -v grep | awk '{print  $4}' | awk 'NR == 1') 

if [ "${RESULT:-null}" = null ]; then 
echo "$1 is NOT running" 
else 
echo "$MEM" 
fi 

if [ "$MEM" -ge 1 ]; then 
mailx -s "Alert: server needs to be checked" [email protected] 
fi 

使用ps輸出的問題,通過管道輸送到sed的是即使沒有進程正在運行,它發現自己:

ps aux | sed -n /nfdump/p 
root  30724 0.0 0.0 105252 884 pts/1 S+ 14:16 0:00 sed -n /process/p 

和他們我的腳本繞過了「服務不運行」的預期結果,並直接回顯$ MEM,在這種情況下,它將爲0.0。 sed是否有一個grep -v grep eqivalent讓自己擺脫困境?

+0

爲什麼不把它管道....的grep -v SED: 'ps aux | grep -v sed | sed -n'/ nfdump/p''?但你也可以嘗試'ps aux | sed -n'/ sed/n;/nfdump/p' '。如果找到sed,'/ sed/n;'會繼續輸入下一行。 –

+0

兩種方式都在腳本之外工作,但是通過腳本和第一個示例,它會繞過「服務未運行」並直接轉到執行$ MEM。如果我使用第二個示例,它會停在「服務未運行」,即使我對運行的服務運行該腳本。 – user53029

+0

你確定你的sed命令在腳本里面工作嗎?在'-n'之後沒有引用部分的引用嗎?您是否嘗試用'bash -x'調試腳本? –

回答

1

讓我再補充一個例子,除了我上面的評論。戰略經濟對話確實是一個相當於grep -v:您可以否定與/RE/!匹配(追加!的正則表達式),所以你可以嘗試:

ps aux | sed -n '/sed/!{ /nfdump/ p;}' 

這裏面{ ... }部分僅適用於線匹配sed

根據記錄:有一個命令pgrep可以取代你PS SED管道,看到pgrep in Wikipedia或其手冊頁。

1

嘗試:

ps aux | sed -n '/[n]fdump/p' 

或:

ps aux | grep '[n]fdump' 

正則表達式將不會在進程列表中找到

+0

請查看[Bash Pitfalls 31](http://mywiki.wooledge.org/BashPitfalls#pf31),瞭解爲什麼你不應該做'ps ax | grep gedit' –

+0

我編寫了'grep'[n] fdump'',而不是'grep nfdump',它的靈感來自http://www.ibm.com/developerworks/library/l-keyc3/#code10。 Bash Pitfalls只是建議不要完全依賴'ps ax'上的grep名稱。這也適用於傳遞給'ps ax'的'sed'命令。我不會依靠它來殺死流程,但如果熟練地使用它可能會有所幫助。也就是說,最好的選擇可能是'pgrep'。 – SLePort

+0

提供的鏈接還提供了'ps aux | grep'[g] edit''爲例。感謝您在評論中提及'pgrep'。 –