運行伺服器時如何更改命令標題?

運行伺服器時如何更改命令標題?

我正在嘗試更改 的輸出lsof -i4TCP:PORT以包含自訂名稱。這將幫助我識別由守護程序啟動的伺服器進程。下面是一張有箭頭的圖片,指向我想要控制的內容。

我創建了一個自訂 gem,在那裡執行了該過程,但它仍然顯示 Ruby。而不是陷入“兔子洞”,想知道其他人是否有這種需求。我本質上想做 docker 所做的事情,並顯示標有我的程式名稱的進程。

低速輸出

答案1

您需要設定進程名稱。在某些系統上,分配一個值$0可以工作,但在 Linux 上不行(至少在我的版本中不行ruby),其中ruby只設定參數列表(如ps -f或中所示ps -o args),而不是進程名稱(如lsofps/中所示ps -o comm)(perl -e '$0 = "foo"'將工作作為perl設定進程名稱和參數列表)。

為此,在 Linux 上,您需要執行以下操作:

prctl(PR_SET_NAME, "newname")

系統調用。

雖然你可以這樣做:

$ ruby -e 'syscall(157, 15, "foo"); system("ps")'
  PID TTY          TIME CMD
5679 pts/4    00:00:01 zsh
8639 pts/4    00:00:00 foo
8641 pts/4    00:00:00 ps

系統呼叫的值取決於體系結構(此處為 amd64 為 157)。

prctl然而,在 的源代碼中greping forruby並沒有帶來任何東西,所以我懷疑ruby.Process.setproctitle()也不設定進程名稱。

@Jessehz on SO 有一個解決方案,使用fiddle呼叫pctrl()C 庫中的函數(假設是動態連結ruby):

$ ruby -e 'require "fiddle"; Fiddle::Function.new(
  Fiddle::Handle["prctl".freeze], [Fiddle::TYPE_INT, Fiddle::TYPE_VOIDP],
  Fiddle::TYPE_INT).call(15, "foo"); system("ps")'
  PID TTY          TIME CMD
 5931 pts/5    00:00:02 zsh
 8943 pts/5    00:00:00 foo
 8945 pts/5    00:00:00 ps

答案2

感謝@Stéphane 的精彩回答。但就我而言,最好的解決方案是將我的腳本捆綁為 Mac OSX 應用程式。您可以在專案的 Info.plist 中控制進程名稱。

相關內容