因此,我想要找到一個簡潔的解決方案的問題是,當我登入伺服器(我有一些 Solaris 和 RHEL 實例)時,我嘗試找出正在運行的應用程式:
$ ps -auxww | grep <thing I look for, usually Java>
我得到了一個很好的進程列表、PID、額外的詳細信息,以及使用它執行的整個進程名稱和參數。雖然這一般來說為我提供了足夠的資訊來了解正在運行的內容,某些伺服器的運作方式有所不同。我可能有一個伺服器,其中有多個用於不同目的的應用程式伺服器實例。其他進程是我混合的掛起進程的殘餘非冷凍的流程。我不想關閉所有java實例,因為我無法找出哪個進程需要終止。
我想提供的解決方案是在我的啟動腳本期間,我想在進程前面或附加一些文本,讓我可以添加簡短的描述。
如果我的要求聽起來不可能/愚蠢/完全不合常理,我願意接受替代解決方案,這些解決方案使我有能力完成同樣的事情。我對想法持開放態度,但這個想法是可行的。
答案1
這是一個例子重力的建議:
$ MARKER=snooze sleep 120&
$ ps ew | grep -o ".*[M]ARKER=snooze"
11741 pts/2 S 0:00 sleep 120 MARKER=snooze
此e
選項使ps
列印成為該過程的環境。該-o
選項和正規表示式會grep
在我們正在搜尋的部分之後切斷任何環境,但我不會打賭它總是會得到如此乾淨的結果(可能會列印更多環境)。將模式的一部分放在方括號中可以執行人們經常使用 for 的功能-從結果中grep -v
消除其自身。grep
答案2
聽起來您想對每個進程進行唯一標記,以便您可以輕鬆發現它。我實際上聽說過一家大公司的監控團隊正在這樣做 - 每個應用程式都有一個獨特的程式碼,可以透過 ps 和 grep 輕鬆找到。
在java上,您可以使用-D來設定任何變量,因此您可以輕鬆地添加諸如“-Dmonitoringid =”之類的內容。該過程會忽略它,但您可以輕鬆地 grep 找到它。
或者,您可以將應用程式伺服器拆分為每個應用程式伺服器在特定於所服務的應用程式的 ID 下運行。目前,我們運行著一個大型 J2EE 應用程式伺服器場,每個伺服器上都有許多應用程序,但是,每個應用程式都在其自己的 ID 下運行,以分割所有權、存取權限、控制權等。
這也意味著在主機上查找任何給定的應用程式伺服器非常簡單:
ps <whichever ps args you like best> | grep java | grep <uid> | grep -v grep