
答案1
您需要設定進程名稱。在某些系統上,分配一個值$0
可以工作,但在 Linux 上不行(至少在我的版本中不行ruby
),其中ruby
只設定參數列表(如ps -f
或中所示ps -o args
),而不是進程名稱(如lsof
或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
然而,在 的源代碼中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 中控制進程名稱。