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

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

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

カスタム gem を作成し、そこでプロセスを実行しましたが、依然として Ruby と表示されます。他に誰かがこのニーズを抱えているかどうか疑問に思い、迷い込むのではなく、基本的には docker が行ったこととまったく同じことを行い、自分のプログラム名でタグ付けされたプロセスを表示したいと思います。

LSOF出力

答え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のソース コードでを grep してもruby何も返されないため、 ではすぐに使用できるサポートがないのではないかと思われますrubyProcess.setproctitle()プロセス名も設定されません。

SOの@Jessehzは次のような解決策を提案している。fiddlepctrl()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 でプロセス名を制御できます。

関連情報