web-dev-qa-db-ja.com

サーバーの実行時にコマンドタイトルを変更するにはどうすればよいですか?

lsof -i4TCP:PORTの出力を変更してカスタム名を含めようとしています。これは、デーモンによって開始されたサーバープロセスを識別するのに役立ちます。以下は、私が制御したいものを指す矢印の付いた写真です。

カスタムgemを作成し、そこでプロセスを実行しましたが、それでもRubyと表示されます。 「うさぎの穴」を降りるのではなく、他の誰かがこの必要性を持っているかどうか疑問に思います。基本的に、dockerが行ったことを正確に実行し、プログラム名でタグ付けされたプロセスを表示したいと思います。

LSOF output

2
iangolden

素晴らしい答えをくれた@Stéphaneに感謝します。しかし、私の場合、最善の解決策は、スクリプトをMacOSXアプリとしてバンドルすることでした。プロジェクトのInfo.plistでプロセス名を制御できます。

0
iangolden

プロセス名を設定する必要があります。一部のシステムでは、_$0_に値を割り当てることは機能しますが、Linuxでは機能しません(少なくとも私のバージョンのRubyでは)。Rubyは引数リストのみを設定します(図を参照)。 _ps -f_または_ps -o args_)にありますが、プロセス名はありません(lsofまたはps/_ps -o comm_のように)(_Perl -e '$0 = "foo"'_は機能しますas 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のソースコードでRubyをgrepしても何も起こらないので、Rubyではすぐにサポートされていないようです。 Process.setproctitle()もプロセス名を設定しません。

@ Jessehz on SOには、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
_
0