Odpowiedzi:
Istnieje kilka opcji:
ps -fp <pid>
cat /proc/<pid>/cmdline | sed -e "s/\x00/ /g"; echo
Jest więcej informacji na /proc/<pid>
temat Linuksa, wystarczy spojrzeć.
Na innych Uniksach może być inaczej. ps
Komenda będzie działać wszędzie, /proc
rzeczy jest OS specyficzny. Na przykład w systemie AIX nie ma cmdline
w /proc
.
ps -ww -fp <pid>
), aby określić szeroki wynik, ponieważ jeśli istnieje kilka poleceń, mogą zostać odcięte.
-ww
opcja umożliwia dostęp do pełnych argumentów wiersza polecenia (jak jest przechowywana przez jądro). Zobacz także: w jaki sposób solaris i bsd pobierają nieskalowane parametry wiersza polecenia dla procesu i opcji ps
cat /proc/<pid>/cmdline
działa również na Cygwin, gdzie argumenty linii cmd nie są wyświetlane w ps
żadnej opcji.
args
, polecenie to jest ps -o args -p <pid>
i wypisze args
lub użyje opcji -o, cmd
jeśli tylko chcesz zobaczyć cmd
. Próba czytania /proc/<pid>/cmdline
nie zawsze będzie działać dla nieuprzywilejowanych użytkowników. ps
Narzędzie będzie działać.
/proc/<pid>/cmdline
jest ograniczona (zakodowana na stałe do wartości parametru jądra PAGE_SIZE), więc dłuższe linie poleceń są nadal pokazywane jako obcięte! Aby uzyskać więcej informacji, zobacz stackoverflow.com/questions/199130/ ... Możesz zapytać o ustawienia jądra getconf PAGE_SIZE
, zwykle jest to 4096.
To załatwi sprawę:
xargs -0 < /proc/<pid>/cmdline
Bez xargs między argumentami nie będzie spacji, ponieważ zostały one przekonwertowane na wartości NUL.
xargs -0 < /proc/<pid>/cmdline
.
W przypadku systemu Linux i Unix można użyć, ps -ef | grep process_name
aby uzyskać pełny wiersz poleceń.
W systemach SunOS, jeśli chcesz uzyskać pełny wiersz poleceń, możesz użyć
/usr/ucb/ps -auxww | grep -i process_name
Aby uzyskać pełną linię poleceń, musisz zostać superużytkownikiem.
pargs -a PROCESS_ID
poda szczegółową listę argumentów przekazanych do procesu. Wyświetli tablicę argumentów w następujący sposób:
argv[o]: first argument
argv[1]: second..
argv[*]: and so on..
Nie znalazłem żadnego podobnego polecenia dla systemu Linux, ale użyłbym następującego polecenia, aby uzyskać podobne dane wyjściowe:
tr '\0' '\n' < /proc/<pid>/environ
W systemie Linux
cat /proc/<pid>/cmdline
dostajesz komendę procesu (łącznie z argumentami), ale wszystkie białe znaki zostały zmienione na znaki NUL.
Możesz używać pgrep
z -f
(pełnym wierszem poleceń) i -l
(długim opisem):
pgrep -l -f PatternOfProcess
Ta metoda ma zasadniczą różnicę w stosunku do innych odpowiedzi: działa na CygWin , dzięki czemu można jej użyć do uzyskania pełnego wiersza polecenia dowolnego procesu działającego w systemie Windows (wykonaj jako podniesiony, jeśli chcesz danych o dowolnym podniesionym / administracyjnym procesie) . Każda inna metoda wykonywania tego w systemie Windows jest bardziej niewygodna ( na przykład ).
Ponadto: w moich testach sposób pgrep był jedynym systemem, który działał w celu uzyskania pełnej ścieżki dla skryptów działających w pythonie CygWin .
$ exec -a fakename bash & [1] 14102 [1]+ Stopped exec -a fakename bash $ xargs -0 < /proc/14102/cmdline; fakename $ pgrep -l -f fakename; 14102 bash
pgrep from procps-ng 3.3.15
i 3.3.12
. Wystarczy wydrukować nazwę pid i prorgam bez argumentów.
Innym wariantem drukowania /proc/PID/cmdline
ze spacjami w systemie Linux jest:
cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo
W ten sposób cat
drukuje znaki NULL jako, ^@
a następnie zamieniasz je spacją za pomocą sed
; echo
wypisuje nowy wiersz.
Oprócz wszystkich powyższych sposobów konwersji tekstu, jeśli po prostu użyjesz „łańcuchów”, domyślnie utworzy on wyjście w osobnych wierszach. Z tą dodatkową zaletą, że może również zapobiegać pojawianiu się znaków, które mogą mieszać twój terminal.
Oba dane wyjściowe w jednym poleceniu:
strings / proc // cmdline / proc // environment
Prawdziwe pytanie brzmi ... czy istnieje sposób, aby zobaczyć prawdziwą linię komend procesu w Linuksie, która została zmieniona, tak aby cmdline zawierał zmieniony tekst zamiast faktycznie uruchomionej komendy.
W Linuksie, z bash, wyprowadza jako cytowane argumenty, aby można było edytować polecenie i uruchomić je ponownie
</proc/"${pid}"/cmdline xargs --no-run-if-empty -0 -n1 \
bash -c 'printf "%q " "${1}"' /dev/null; echo
W Solarisie, z bash (testowany z wydaniem 3.2.51 (1)) i bez przestrzeni użytkownika GNU:
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 Przykład (wklej w terminalu):
{
## 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
}
Wynik:
MATCH
Przykład Solaris Bash:
{
## 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
}
Wynik:
MATCH
tr \\0 ' ' < /proc/<pid>/cmdline