ご存知のように、コマンドを実行するためのコマンドラインランタイム引数を取得するには、または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を指定しておらず、ps
OSによって異なります(Linuxではディストリビューションによって異なります)。 LinuxとFreeBSDの両方が少なくとも要件を満たしています/proc
。
ps -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
答え2
あなたは間違いなく読み始める必要がありますマニュアルページ。例はman ps
(オンラインマニュアルページ):
-f Do full-format listing. This option can be combined with many other UNIX-style options to add additional columns. It also causes the command arguments to be printed. When
used with -L, the NLWP (number of threads) and LWP (thread ID) columns will be added. See the c option, the format keyword args, and the format keyword comm.
だから走ってくださいps -ef | grep rackup
;-)
答え3
もちろん、プログラムはそのパラメータにアクセス(変更および削除)できます。これは、特にユーザー名、パスワード、その他の機密情報が破損する可能性がある場合は、セキュリティ機能と見なされます。アドレス、ポート、共有メモリキー、その他の情報も機密情報と見なすことができます。
サーバーデーモンおよび他のブランチ/実行サブプロセスも処理中にパラメーターを削除できます。