运行服务器时如何更改命令标题?

运行服务器时如何更改命令标题?

我正在尝试更改 的输出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 中控制进程名称。

相关内容