it-swarm.com.de

Wie können die Befehlszeilenargumente an einen laufenden Prozess auf Unix-/Linux-Systemen übergeben werden?

Unter SunOS gibt es den Befehl pargs, der die Befehlszeilenargumente ausgibt, die an den laufenden Prozess übergeben werden. 

Gibt es ähnliche Befehle in anderen Unix-Umgebungen?

167
Hemant

Es gibt mehrere Möglichkeiten:

ps -fp <pid>
cat /proc/<pid>/cmdline

Es gibt mehr Informationen in /proc/<pid> unter Linux, schauen Sie einfach nach.

Bei anderen Unixen kann es anders sein. Der Befehl ps funktioniert überall, der /proc-Vorgang ist betriebssystemspezifisch. In AIX gibt es beispielsweise keine cmdline in /proc.

264
markus_b

Dies wird den Trick tun:

xargs -0 < /proc/<pid>/cmdline

Ohne die xargs werden zwischen den Argumenten keine Leerzeichen angezeigt, da sie in NULs konvertiert wurden.

58

Auf Linux

cat /proc/<pid>/cmdline

holen Sie sich die Befehlszeile des Prozesses (einschließlich args), aber mit allen Leerzeichen in NUL-Zeichen.

14
lothar

Für Linux- und Unix-Systeme können Sie ps -ef | grep process_name verwenden, um die vollständige Befehlszeile zu erhalten. 

Wenn Sie unter SunOS System eine vollständige Befehlszeile erhalten möchten, können Sie /usr/ucb/ps -auxww | grep -i process_name verwenden. Stellen Sie sicher, dass Sie in SunOS die vollständige Befehlszeile erhalten, um Superuser zu werden.

pargs -a PROCESS_ID. Dadurch erhalten Sie eine detaillierte Liste der an den Prozess übergebenen Argumente. Es gibt das Array von Argumenten in der Ausgabe wie Argv [o]: first argumen Argv [1]: second .. so weiter ..

Ich habe keinen ähnlichen Befehl gefunden, aber ich würde folgenden Befehl geben, um einen solchen Ausgang tr '\0' '\n' < /proc/<pid>/environ in der Linux-Umgebung zu erhalten.

14
LOGAN

Sie können pgrep mit -f (vollständige Befehlszeile) und -l (Lange Beschreibung):

pgrep -l -f PatternOfProcess

Diese Methode hat einen entscheidenden Unterschied zu allen anderen Antworten: Sie funktioniert mit CygWin, sodass Sie mit ihr die vollständige Befehlszeile von allen abrufen können Prozess, der unter Windows ausgeführt wird (Ausführen als erhöht , wenn Sie Daten über einen erhöhten/admin-Prozess wünschen). Jede andere Methode, um dies unter Windows zu tun, ist umständlicher, zum Beispiel .
Außerdem: In meinen Tests war der pgrep-Weg das einzige System, mit dem der vollständige Pfad für Skripte, die in CygWins Python laufen .

12

Eine weitere Variante des Druckens von /proc/PID/cmdline mit Leerzeichen in Linux ist:

cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo

Auf diese Weise druckt catNULL-Zeichen als ^@ und ersetzt sie durch ein Leerzeichen mit sed; echo druckt eine neue Zeile.

3
Diego

Sie können einfach verwenden:

ps -o args= -f -p ProcessPid
1
Mitar

Unter Linux, mit Bash, um die Ausgabe in Anführungszeichen auszugeben, damit Sie den Befehl bearbeiten und erneut ausführen können

</proc/"${pid}"/cmdline xargs --no-run-if-empty -0 -n1 \
    bash -c 'printf "%q " "${1}"' /dev/null; echo

Unter Solaris, mit bash (getestet mit 3.2.51 (1) -release) und ohne GNU-Userland:

IFS=$'\002' tmpargs=( $( pargs "${pid}" \
    | /usr/bin/sed -n 's/^argv\[[0-9]\{1,\}\]: //gp' \
    | tr '\n' '\002' ) )
for tmparg in "${tmpargs[@]}"; do
    printf "%q " "$( echo -e "${tmparg}" )"
done; echo

Linux bash Beispiel (Einfügen in Terminal):

{
## setup intial args
argv=( /bin/bash -c '{ /usr/bin/sleep 10; echo; }' /dev/null 'BEGIN {system("sleep 2")}' "this is" \
    "some" "args "$'\n'" that" $'\000' $'\002' "need" "quot"$'\t'"ing" )

## run in background
"${argv[@]}" &

## recover into eval string that assigns it to argv_recovered
eval_me=$(
    printf "argv_recovered=( "
    </proc/"${!}"/cmdline xargs --no-run-if-empty -0 -n1 \
        bash -c 'printf "%q " "${1}"' /dev/null
    printf " )\n"
)

## do eval
eval "${eval_me}"

## verify match
if [ "$( declare -p argv )" == "$( declare -p argv_recovered | sed 's/argv_recovered/argv/' )" ];
then
    echo MATCH
else
    echo NO MATCH
fi
}

Ausgabe:

MATCH

Solaris Bash-Beispiel:

{
## setup intial args
argv=( /bin/bash -c '{ /usr/bin/sleep 10; echo; }' /dev/null 'BEGIN {system("sleep 2")}' "this is" \
    "some" "args "$'\n'" that" $'\000' $'\002' "need" "quot"$'\t'"ing" )

## run in background
"${argv[@]}" &
pargs "${!}"
ps -fp "${!}"

declare -p tmpargs
eval_me=$(
    printf "argv_recovered=( "
    IFS=$'\002' tmpargs=( $( pargs "${!}" \
        | /usr/bin/sed -n 's/^argv\[[0-9]\{1,\}\]: //gp' \
        | tr '\n' '\002' ) )
    for tmparg in "${tmpargs[@]}"; do
        printf "%q " "$( echo -e "${tmparg}" )"
    done; echo
    printf " )\n"
)

## do eval
eval "${eval_me}"


## verify match
if [ "$( declare -p argv )" == "$( declare -p argv_recovered | sed 's/argv_recovered/argv/' )" ];
then
    echo MATCH
else
    echo NO MATCH
fi
}

Ausgabe:

MATCH
1
Iwan Aucamp

Unter Solaris

     ps -eo pid,comm

Ähnliches kann auf Unix-ähnlichen Systemen verwendet werden. 

1
HuntM

Anstatt mehrere Befehle zum Bearbeiten des Streams zu verwenden, verwenden Sie einfach einen Befehl - tr übersetzt ein Zeichen in ein anderes:

tr '\0' ' ' </proc/<pid>/cmdline
1
Tom Evans

Zusätzlich zu den oben genannten Möglichkeiten zum Konvertieren des Textes wird die Ausgabe standardmäßig in separaten Zeilen ausgeführt, wenn Sie einfach "Zeichenfolgen" verwenden. Mit dem zusätzlichen Vorteil, dass möglicherweise auch Zeichen vermieden werden, die Ihr Terminal verfälschen könnten.

Beide werden in einem Befehl ausgegeben:

strings/proc // cmdline/proc // environ

Die eigentliche Frage ist ... gibt es eine Möglichkeit, die echte Befehlszeile eines Prozesses in Linux zu sehen, der so geändert wurde, dass die cmdline den geänderten Text enthält, anstelle des tatsächlich ausgeführten Befehls.

1

versuchen Sie "ps -n" in einem Linux-Terminal. das wird zeigen: 

1.Alle Prozesse RUNNING, ihre Befehlszeile und ihre PIDs 

  1. Das Programm initiiert die Prozesse. 

Danach wissen Sie, welchen Prozess Sie töten müssen

0
repzero

Wenn Sie möglichst lange erhalten möchten (nicht sicher, welche Grenzen es gibt), ähnlich wie bei Solaris ' pargs , können Sie dies unter Linux und OSX verwenden:

ps -ww -o pid,command [-p <pid> ... ]
0
pourhaus