23 Stimmen

Wie wird /proc/pid/cmdline geparst?

Ich versuche, die cmdline eines Prozesses unter Linux aufzuteilen, aber es scheint, dass ich mich nicht darauf verlassen kann, dass sie durch ' \0 ' Zeichen. Wissen Sie, warum manchmal die ' \0 ' als Trennzeichen verwendet wird und manchmal ist es ein normales Leerzeichen?

Kennen Sie eine andere Möglichkeit, den Namen der ausführbaren Datei und den Pfad zu ihr zu ermitteln? Ich habe versucht, diese Informationen mit "ps" zu erhalten, aber es gibt immer die gesamte Befehlszeile zurück und der Name der ausführbaren Datei wird abgeschnitten.

Danke.

25voto

riywo Punkte 1329

Utiliser strings

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

20voto

Employed Russian Punkte 180738

El /proc/PID/cmdline est toujours getrennt durch NUL-Zeichen.

Um Leerzeichen zu verstehen, führen Sie diesen Befehl aus:

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

EDIT: Wenn Sie wirklich Leerzeichen sehen, wo keine sein sollten, schreibt Ihre ausführbare Datei vielleicht (absichtlich oder versehentlich) nach argv[] , oder verwendet setproctitle() ?

Wenn der Prozess vom Kernel gestartet wird, ist cmdline NUL-getrennt, und die Der Kernel-Code kopiert einfach den Bereich des Speichers, in dem argv[] beim Start des Prozesses in den Ausgabepuffer geschrieben wurde, wenn Sie /proc/PID/cmdline .

17voto

Dag Rende Punkte 159

Verwenden Sie

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

um die Args durch Leerzeichen getrennt zu erhalten, so wie Sie es in einer Befehlszeile sehen würden.

17voto

hek2mgl Punkte 142036

Die Befehlszeilenargumente in /proc/PID/cmdline sind durch Null-Bytes getrennt. Sie können verwenden tr um sie durch neue Linien zu ersetzen:

tr '\0' '\n' < /proc/"$PID"/cmdline

4voto

Jed Smith Punkte 15042

Ein Schuss ins Blaue, aber ist es möglich, dass \0 die Begriffe voneinander trennt und Leerzeichen die Wörter innerhalb eines Begriffs? Zum Beispiel,

myprog "foo bar" baz

könnte erscheinen in /proc/pid/cmdline als...

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

Ich kann keine Leerzeichen auf einer meiner Linux-Boxen finden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X