X

Oracle Solaris, Oarcle ハードウェア製品に関する情報

ps コマンドと /proc/<pid> の機能向上

Guest Author

はじめに

先日 Solaris 11.3 の新しい SRU がリリースされました。このリリースには、ps コマンドのコマンドライン文字列の扱いに関する機能向上が含まれています。その詳細について Casper Dik が ブログ記事 にまとめていましたので、ご紹介いたします。

翻訳文

Solaris 2.0 がリリースされると、ps(1) コマンドの出力が 80 文字に制限されていることについての不満が出るようになりました。また、ps(1) コマンドは環境変数を出力することができませんでした。

それらの問題は /usr/ucb/ps コマンドを使うことで解決できましたが、その実装は対象プロセスのアドレス空間を逐一読み出すことで実現されていました。これを権限のエスカレーションなしに動作させるには、少なくとも同じ権限と uid/gid が必要になります。{proc_owner} 権限だけでは不十分でした。

Solaris に pkill(1) と pgrep(1) を追加したときも、同じ問題が持ち上がりました。コマンドラインの最初の 80 文字(PRARGSZ で指定されている文字数)と、コマンド名の最初の 16 文字(PRFNSZ で指定されている文字数)しか表示できなかったのです。

これらは深刻な問題でした。例えば、Java のプロセスではコマンドラインの文字数が 80 文字を越えることは普通で、しかも重要な JAR ファイル指定の場所は 80 文字よりあとにあることがよくありました。

もちろん、お客さまからもこの挙動は好かれていませんでした。

この問題は Solaris 12 では修正されていますが、この度、Solaris 11.3 SRU 5.6 にも /proc/<pid> に以下の 3 つのファイルが追加されました。

  • cmdline - プロセス起動時のコマンドライン引数を NUL 区切りで格納
  • environ - プロセス起動時の環境変数を NUL 区切りで格納
  • execname - プロセス起動時に exec に渡されたプログラム名を格納

cmdline と execname はパブリックに読み出し可能、environ ファイルはプロセスの所有者か {proc_owner} 権限を持ったプロセスからのみアクセス可能です。cmdline と environ ファイルは Linux の同名のファイルとほぼ同じですが、プロセスのアドレス空間内にある実際のコマンドライン文字列を反映しており、プログラム自身による上書きは反映されません。

ps(1) コマンドには -o オプションで指定可能なフォーマットに "env" が追加されました。/proc/<pid> の新しいファイルが使用されるようになり、コマンドライン文字列は省略されることなく表示されるようになりました。

ps(1) や ps(1b) は /proc/<pid>/as (as => address space) ファイルを開く必要がなくなったので、以前に比べて必要な権限が抑えられており、実行ファイルの読み出しも不要になりました。これは ps(1b) の性能向上にも繋がっており、特に NFS 上にも実行ファイルが配置されている場合などに効果的です。

これらは基本的には Solaris 12 の ps 及び /proc の修正のバックポートになっており、解決されたバグと機能改善の一覧は以下の通りです。

PSARC/2015/207 /proc/<pid>/{cmdline,environ,execname} の追加
15742822 SUNBT7092685 ps(1) がコマンドライン文字列をもっと表示できるような /proc インターフェイスの拡張
15420404 SUNBT6599384 pgrep/pkill が 16 文字のファイル名のプロセスを発見・検索できない
19669195 ucbps.c:569 の ucb_procinfo でメモリリーク
15227016 SUNBT5100626 ps(1) コマンドが ttyname に空の文字列を表示することがある
15282779 SUNBT6313436 /usr/ucb/ps の malloc() の失敗が引数の解析時に予測不能な結果を引き起こす
14966583 SUNBT4157509 /usr/ucb/ps に BSD や SunOS 4.x のコマンドと互換性が無い
15488063 SUNBT6715628 ps -d が -z を無効にする
21447952 /usr/ucb/ps gxw がハングするが、w なしの場合は動作する。/proc/<pid>/as をオープンしない。
21297345 procfs の制御メッセージサイズの制限
15582848 SUNBT6872216 ps コマンドは以前の name と uid 情報を参照する必要がある
15584899 SUNBT6875625 ps コマンドは、ロックの競合を避けるため、/proc に chdir すべきである




Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.