答案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 中控制进程名称。