Process

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

  • May 20, 2017

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

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

LSOF 輸出

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

您需要設置程序名稱。在某些系統上,為 to 分配一個值$0會起作用,但在 Linux 上不起作用(至少在我的版本中沒有ruby),其中ruby只設置 arg 列表(如在ps -for中看到ps -o args),而不是程序名稱(如在lsofor ps/中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在原始碼中greppingruby並沒有帶來任何東西,所以我懷疑ruby. Process.setproctitle()也沒有設置程序名稱。

SO上的@Jessehz有一個解決方案fiddle,用於呼叫C庫中的函式(假設我認為pctrl()是動態連結的):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

引用自:https://unix.stackexchange.com/questions/365955