2009-10-18 11 views
9

私はLinux上でプロセスのcmdlineを分割しようとしていますが、 '\ 0'文字で区切ることはできません。 '\ 0'文字がセパレータとして使用されることがあり、時にはそれが通常のスペースであることが時々分かっていますか?/proc/pid/cmdlineを解析する方法

実行可能ファイル名とそのパスを取得する他の方法を知っていますか?私は 'ps'でこの情報を取得しようとしていますが、常に完全なコマンドラインを返し、実行可能ファイル名は切り捨てられます。

ありがとうございました。

答えて

3

暗闇の中で撮影しましたが、\0は用語を区切っており、単語は単語内で単語を区切っていますか?例えば、

myprog "foo bar" baz 

がここ/proc/pid/cmdline

/usr/bin/myprog\0foo bar\0baz 

...完全な推測に表示されるかもしれませんが、私は自分のLinuxボックスのいずれか上の任意のスペースを見つけるように見えることはできません。

+1

こんにちは:あなたは、新しいラインでそれらを交換するためにtrを使用することができます。あなたが言及しているように、スペースは同じ単語の単語を分離するために使用されています、これは私が期待していたものですが、私もスペースを使って単語を区切っているマシンにアクセスできます。それはUbuntuだった、どのリリースを知らない。 – ryotakatsuki

10

/proc/PID/cmdlineは、であり、常にであり、NUL文字で区切られている。

cat -v /proc/self/cmdline "a b" "c d e" 

EDIT:あなたは本当にすべてがあってはならないスペースが表示された場合は、おそらくあなたの実行ファイル(故意または不注意が)argv[]への書き込み、またはsetproctitle()を使用している、スペースを理解して、このコマンドを実行するには

プロセスがカーネルで起動すると、コマンドラインパラメータはNULで区切られ

、そしてあなたが/proc/PID/cmdlineを読んだときargv[]は、出力バッファにプロセスの起動時にしたメモリのkernel code simply copies範囲。

+0

私が上記のように、私が同僚の "解決策"を説明している間、私は彼のcmdlineが私が予想していたように振舞っていないことに気付きました。私たちはどちらもUbuntuを使用しているので、これが設定できる動作か、使用されているカーネルに依存しているのか分かりません。 – ryotakatsuki

+0

これは間違っています。引数を区切るスペースがある場合もあります。つまり、argv [0]にあります。私はこれを見ているので、これを知っています。 – camh

+0

プログラムによる引数ベクトルの変更は、私があなたのステートメントに反対した理由です。あなたが「いつも」と言わずに強調していれば、私はコメントしていないでしょう。 – camh

2

私の答えはhereです。それは自分でこれをしようとしたときに私が見つけたものをカバーしています。

編集:debian-userのthisスレッドを見て、あなたが望むことをするのに最善を尽くすbashスクリプトを探してください(そのスレッドのスクリプトのバージョン3を探してください)。

+0

こんにちは。 私は既に、そのパスでプロセスを追跡するのに似たようなことをしていますが、exeのシンボリックリンクを読んでいますが、大きな問題はcmdの実行可能ファイル名を取得することです。私は、通常、プロセス実行可能ファイルを参照するときは、 "emacsのPIDが必要です"と言って、EXEが指しているように "/ usr/bin/emacs22-gtk"ではなく "emacs"を見つけることを期待しています。 私が考慮していないのは、readlinkによって報告された '(Deleted)'文字列です。 cmdlineの情報を適切に分割できたら、その情報を 'exe'によって提供される情報と混在させることができます。 いずれにしても、明らかな方法はないようです:)。ありがとう! – ryotakatsuki

+0

実装に含まれるスクリプトを投稿したスレッドへのリンクを追加しました。実行可能な名前をスペースで処理することはありませんが、まれです(まれに見たことはありません) – camh

+0

Uaaa ...素晴らしい仕事、ありがとう! – ryotakatsuki

14

使用strings

$ cat /proc/self/cmdline | strings -1 
cat 
/proc/self/cmdline 
6

使用

cat /proc/2634/cmdline | tr "\0" " " 

コマンドラインでそれを見ると同じように、空白で区切られた引数を取得します。

+0

"tr"だけでも "cat + tr"を使う必要はありません。@ hek2mgl answerを参照してください。 –

4

/proc/PID/cmdlineのコマンドライン引数は、nullバイトで区切られています。

tr '\0' '\n' < /proc/"$PID"/cmdline 
関連する問題