Process

如何防止“ps”報告自己的程序?

  • August 12, 2021
$ ps | grep django
28006 ttys004    0:01.12 /usr/bin/python bin/django celeryd --beat
51393 ttys005    0:01.45 /usr/bin/python bin/django celeryd -l INFO
51472 ttys005    0:01.29 /usr/bin/python bin/django celeryd -l INFO
51510 ttys005    0:01.89 /usr/bin/python bin/django celeryd -l INFO
51801 ttys005    0:01.83 /usr/bin/python bin/django celeryd -l INFO
53470 ttys005    0:03.97 /usr/bin/python bin/django celeryd -l INFO
53780 ttys005    0:00.00 grep django

有沒有辦法防止報告最後一個程序(即與我的 ps 命令同時啟動的 grep)?

(我開始嘗試想出一個匹配文字但不匹配自身的正則表達式,但這似乎,嗯,不是正確的方法……)

我的答案是在列表中搜尋“foobar”的典型答案的變體ps。我相信,的論點"-A" "ps"比 更便於攜帶"aux",但這種變化與答案無關。典型的答案如下所示:

$ ps -A -ww | grep [f]oobar

相反,我使用這種模式:

$ ps -A -ww | grep [^]]foobar

主要優點是基於此模式編寫腳本更容易,因為您只需將靜態字元串[^]]與您正在尋找的任何模式連接起來。您不需要剝離字元串的第一個字母,然後將其插入方括號之間,然後將它們再次連接在一起。在 shell 中編寫腳本時,簡單地[^]]停留在您正在尋找的模式前面會更容易。Bash 中的字元串切片是一件醜陋的事情,所以我的變體避免了這種情況。這種變體表示顯示模式匹配的行,沒有前導右方括號 ]。由於排除方括號的搜尋模式實際上將方括號添加到模式中,因此它永遠不會匹配自身。

所以你可以編寫一個可移植的psgrep命令,如下所示。在這裡,我考慮了 Linux、OS X BSD 和其他系統之間的差異。這會添加來自 的列標題ps,提供更自定義的ps更適合我需要的格式,並顯示列出額外、額外寬的程序,以便不會遺漏任何命令行參數。好吧,大多數都沒有錯過。Java 是 Java,它經常以最糟糕的方式做事,因此您的一些 Java 服務將執行超過程序表將跟踪的最大允許參數長度。我相信這是 1024 個字元。允許啟動程序的單獨命令長度要長得多,但核心程序表不會費心跟踪任何長度超過 1K 的內容。一旦命令啟動,就不需要命令名稱和參數列表,因此儲存在程序表中的內容只是資訊性的。

psgrep ()
{
   pattern=[^]]${1};
   case "$(uname -s)" in
       Darwin)
           ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
       ;;
       Linux)
           ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
       ;;
       *)  # other UNIX flavors get a minimalist version.
           ps -A -ww | grep -i -e ${pattern}
       ;;
   esac
}

引用自:https://serverfault.com/questions/367921