Process
如何防止“ps”報告自己的程序?
$ 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 }