lsof -i4TCP:PORT
の出力を変更してカスタム名を含めようとしています。これは、デーモンによって開始されたサーバープロセスを識別するのに役立ちます。以下は、私が制御したいものを指す矢印の付いた写真です。
カスタムgemを作成し、そこでプロセスを実行しましたが、それでもRubyと表示されます。 「うさぎの穴」を降りるのではなく、他の誰かがこの必要性を持っているかどうか疑問に思います。基本的に、dockerが行ったことを正確に実行し、プログラム名でタグ付けされたプロセスを表示したいと思います。
素晴らしい答えをくれた@Stéphaneに感謝します。しかし、私の場合、最善の解決策は、スクリプトをMacOSXアプリとしてバンドルすることでした。プロジェクトのInfo.plistでプロセス名を制御できます。
プロセス名を設定する必要があります。一部のシステムでは、_$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
_