ps出力またはprocfsにラックアップのコマンドラインオプションが表示されない

ps出力またはprocfsにラックアップのコマンドラインオプションが表示されない

ご存知のように、コマンドを実行するためのコマンドラインランタイム引数を取得するには、またはps -e解析を実行します/proc/<pid>/cmdline

ただし、このメソッドがパスのみでパラメータを持たないコマンドのみを返す場合、問題が発生します。たとえば、

$ rackup private_pub.ru -s thin -E production

Thin web server (v1.5.1 codename Straight Razor)
Maximum connections set to 1024
Listening on 0.0.0.0:9292, CTRL+C to stop

$ ps -e | grep rackup

16226 ttys001    0:02.19 /home/user/.rvm/gems/ruby-1.9.3-p429@gearup/
bin/rackup  

$ xargs -0 echo < /proc/16226/cmdline

/home/user/.rvm/gems/ruby-1.9.3-p429@gearup/bin/rackup

private_pub.ru続いた論争はなかった。

rackupオプションを「食べて」見えないようにすることは可能ですかps

この行動の理由は何ですか?私の主な問題は、psまたはの特定のパラメータを使用して特定のプロシージャを見つけることですprocfs

出力は次のとおりですstrace -rf -e trace=process rackup

0.000000 execve("/home/user/.rvm/gems/ruby-1.9.3-p385@global/bin/rackup", ["rackup", "private_pub.ru", "-s", "thin", "-E", "production"], [/* 89 vars */]) = 0
     0.003323 arch_prctl(ARCH_SET_FS, 0x7f1f1b1b1740) = 0
     0.001193 execve("/home/user/.rvm/gems/ruby-1.9.3-p385@gearup/bin/ruby_noexec_wrapper", ["ruby_noexec_wrapper", "/home/user/.rvm/gems/ruby-1.9.3-p"..., "private_pub.ru", "-s", "thin", "-E", "production"], [/* 89 vars */]) = 0
     0.002065 arch_prctl(ARCH_SET_FS, 0x7f04829a8740) = 0
     0.001028 execve("/home/user/.rvm/gems/ruby-1.9.3-p385@gearup/bin/ruby", ["ruby", "/home/user/.rvm/gems/ruby-1.9.3-p"..., "/home/user/.rvm/gems/ruby-1.9.3-p"..., "private_pub.ru", "-s", "thin", "-E", "production"], [/* 89 vars */]) = -1 ENOENT (No such file or directory)
     0.000294 execve("/home/user/.rvm/gems/ruby-1.9.3-p385@global/bin/ruby", ["ruby", "/home/user/.rvm/gems/ruby-1.9.3-p"..., "/home/user/.rvm/gems/ruby-1.9.3-p"..., "private_pub.ru", "-s", "thin", "-E", "production"], [/* 89 vars */]) = -1 ENOENT (No such file or directory)
     0.000286 execve("/home/user/.rvm/rubies/ruby-1.9.3-p385/bin/ruby", ["ruby", "/home/user/.rvm/gems/ruby-1.9.3-p"..., "/home/user/.rvm/gems/ruby-1.9.3-p"..., "private_pub.ru", "-s", "thin", "-E", "production"], [/* 89 vars */]) = 0
     0.005911 arch_prctl(ARCH_SET_FS, 0x7f4c84595740) = 0
     0.013703 clone(Process 9182 attached
child_stack=0x7f4c845c1fb0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f4c845c29d0, tls=0x7f4c845c2700, child_tidptr=0x7f4c845c29d0) = 9182

>> Thin web server (v1.5.1 codename Straight Razor)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:9292, CTRL+C to stop

ベストアンサー1

OSを指定しておらず、psOSによって異なります(Linuxではディストリビューションによって異なります)。 LinuxとFreeBSDの両方が少なくとも要件を満たしています/procps -e出力comm(切り捨てられた「コマンド」)のみを遵守し、引数は遵守しません。

Linuxまたは* BSDで試してくださいps

ps axwwo "pid ppid uid comm args"

argsは必要なフィールドであり、ダブル「w」オプションを使用すると「無制限の幅」出力が可能です。フルパスは使用可能なスペースを超える可能性があるため(psプロセスごとに1行を好み、端末の幅を確認してください)、フルパスまたは引数は必ずしも表示されません。

しかし、使用法は/proc/xx/cmdline正確であり、まったく議論の余地はありません。

2番目の問題は、rackup実行可能ファイルがシェルスクリプトであるという事実によって発生する可能性があります。スクリプトが一時的であり、パラメータがRubyに吸い込まれると推測されますARGV

strace -rf -e trace=process rackup ...

何が起こったのか見てください。

-Pラックアップまたはオプションを使用して各インスタンスのPIDファイルを記録できる必要があり--pid、必要に応じて特定のインスタンスを監視および区別できます。

一般に、最良のツールは、名前および/またはパラメータでプロセスを識別することpgrepです。pidof

おすすめ記事