2015-01-13 27 views
1

我在寫一個unix shell腳本,需要檢查當前是否有正在運行的進程在其目錄中有「xyz」。如果是,繼續下一個命令並顯示文本,如「找到它」。在unix中如何找出進程是否正在運行並返回true/false?

如果不是,請不要繼續顯示「未找到過程」等文本。

我想是這樣的:

if ps -ef | grep xyz 
then 
    echo "XYZ Process Found!" 
else 
    echo "XYZ Process Not Found!" 
fi 

但它只是帶我「發現過程」即使沒有XYZ過程的過程和顯示。

回答

2

我相信你想檢查命令的輸出與使用Command substition的值,從鏈接的bash黑客wiki 命令替換擴展到命令的輸出。這些命令在子shell中執行,它們的標準輸出數據是替代語法擴展的內容。此外,計數行並刪除grep。喜歡的東西,

if [[ $(ps -ef | grep xyz | grep -v grep | wc -l) != 0 ]]; then 
     echo "XYZ Process Found!" 
else 
     echo "XYZ Process Not Found!" 
fi 

編輯

基於下面的評論,你應該使用

if [[ $(ps -ef | grep -c xyz) -ne 1 ]]; then 

這是一個更容易閱讀。

+0

這隻適用於我將!= 0更改爲!= 1,因爲在ps -ef中,即使沒有任何匹配,它也會爲每組進程返回一個頭。 – user1508682

+0

@ user1508682我在這裏先測試了一下,當我使用!= 1時,我得到了「Process Found」。'ps --version' outputs * procps-ng version 3.3.9 * here。你有沒有相同的? –

+2

太多的UUO * .. http://www.smallo.ruhr.de/award.html#wc'if ps -ef | grep -q [x] yz;然後...其他... fi'應該工作.. – anishsane

3

當您運行grep xyz時,該進程 - grep xyz - 也在運行&,從而顯示在ps -ef的輸出中。
此正在運行的進程命令行包含xyz。因此,grep將該行傳遞給輸出。
因此,您總是會得到零退出狀態 - 即成功。

2解決方案:

  1. 使用if ps -ef | grep '[x]yz'; then。 (您可能想用-q來抑制grep輸出)
    正在運行的grep命令是grep [x]yz。這將輸出ps -ef打印。
    顯然,grep會過濾掉這一行。 [x]yz可能與\[x\]yz匹配,而不是與[x]yz匹配。

  2. 使用if pgrep -f xyz >/dev/null; then
    檢查man pgrep瞭解更多詳情..

+0

'pgrep'通常是人們喜歡的東西。但我更喜歡'grep [x] yz'版本。如果你不想壓制輸出,你可以在屏幕上獲得命令行。否則你需要使用'ps -f $(pgrep -f xyz)'來達到這個目的。 – anishsane

2

您還可以使用pgrep。從pgrep(1)

pgrep looks through the currently running processes and lists the process IDs which match the selection criteria to stdout.

[...]

EXIT STATUS
0 One or more processes matched the criteria.
1 No processes matched.
2 Syntax error in the command line.
3 Fatal error: out of memory etc.

輸出示例:

[~]% pgrep xterm 
18231 
19070 
31727 

您可以在if語句中使用它,如下所示:

if pgrep xterm > /dev/null; then 
    echo Found xterm 
else 
    echo xterm not found 
fi 

注:pgrep不是一個標準的實用程序(即它的不在POSIX中),但至少可以在Linux上廣泛使用,我相信大多數BSD系統。

相關問題