Process
執行伺服器時如何更改命令標題?
我正在嘗試更改 的輸出
lsof -i4TCP:PORT
以包含自定義名稱。這將幫助我辨識由我的守護程序啟動的伺服器程序。下面是一張帶箭頭的圖片,指向我想要控制的內容。我創建了一個自定義 gem,在那裡執行了這個過程,它仍然顯示 Ruby。而不是進入“兔子洞”,想知道是否有其他人有這種需要。我基本上想做 docker 所做的事情,並顯示帶有我的程序名稱標記的過程。
感謝@Stéphane 的出色回答。但就我而言,最好的解決方案是將我的腳本捆綁為 Mac OSX 應用程序。您可以在項目的 Info.plist 中控制您的程序名稱。
您需要設置程序名稱。在某些系統上,為 to 分配一個值
$0
會起作用,但在 Linux 上不起作用(至少在我的版本中沒有ruby
),其中ruby
只設置 arg 列表(如在ps -f
or中看到ps -o args
),而不是程序名稱(如在lsof
orps
/中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