2010-11-05 15 views
2

我想寫一個腳本來計算運行匹配模板的進程的數量。如果它超過了一個硬編碼值,那麼做一些事情......其他的做別的。Bash腳本與基本的if/else和基於模式運行的進程的數量

我使用找出的進程計數:

ps ax | grep process_name | wc -l | sed -e "s: ::g" 

如果上述命令的輸出大於15..it應回聲「完成」。否則,回聲「不完整」。

到目前爲止,我有這一點,但它不工作:

numprocesses=ps ax | grep sms_queue | wc -l | sed -e "s: ::g" 
if [ $numprocesses -le "15" ] ; then 
    echo "Done." 
else 
    echo "Not Complete." 
fi 

回答

8
numprocesses=$(ps ax | grep '[s]ms_queue' | wc -l) 
if [[ $numprocesses -gt 15 ]] ; then 
    echo "Done." 
else 
    echo "Not Complete." 
fi 

你有一些問題。

  • 您的if語句與您的規格不完全相符。
  • 要捕獲xyz命令的輸出,應該使用$(xyz)
  • 無需從輸出中清除空格。
  • 如果您不想接收grep進程(因爲它也有它正在查找的模式),您應該使用grep模式[firstchar]rest(或者您可以使用| grep sms_queue | grep -v grep從計數中刪除grep進程爲好。
  • 沒有必要在比較中使用的字符串 「15」。
+2

由於這個答案列出了除主要錯誤之外的各種改進,我想添加使用算術表達式的建議:'if(($ numprocesses> 15));那麼...'。這是更好閱讀。 – MForster 2010-11-05 07:04:32

+0

@paxdiablo:你真的不覺得* string *「15」與你的* number * 15有什麼不同嗎? :) – 2010-11-05 07:53:58

+0

@MForster:這比'[[]]'更便於攜帶。我建議使用簡單的舊'''又名'測試'。 – 2010-11-05 07:55:14

1

如果您希望將命令的輸出複製到一個變量使用的語法如下:

variable=$(my command) 
+0

或變量= \'我的命令\' – 2010-11-05 06:58:12

+3

這是正確的,但我認爲'$(...)'是優選的。它更容易閱讀(不能與「...」混淆)並且可以嵌套。 – MForster 2010-11-05 07:01:51

+0

@MForster:反引號也可以嵌套(儘管只有一層深度) – 2010-11-05 07:57:10

0

如何

pgrep -c sms_queue 

而且整個(便攜式)版本的劇本是這樣的:

if [ "$(pgrep -c sms_queue)" -le 15 ]; then 
    echo "Done." 
else 
    echo "Not Complete." 
fi 
+0

便攜式?那很有意思。你的腳本似乎不會在'csh'中運行。還是這是一些自我定義的便攜式我以前沒有聽說過? :-) – paxdiablo 2010-11-05 08:35:05

+1

@paxdiablo:這是POSIX的定義。我很清楚,這個腳本不會在csh,perl和大多數其他腳本語言的解釋器中運行。 – 2010-11-05 10:07:02