Ответы:
Есть несколько вариантов:
ps -fp <pid>
cat /proc/<pid>/cmdline | sed -e "s/\x00/ /g"; echo
Больше информации в /proc/<pid>
Linux , просто посмотрите.
В других Unixes все может быть иначе. Команда ps
будет работать везде, /proc
все зависит от ОС. Например, в AIX нет cmdline
в /proc
.
ps -ww -fp <pid>
), чтобы указать широкий вывод, так как, если есть несколько команд, они могут быть обрезаны.
-ww
опция позволяет получить доступ к полным аргументов командной строки (столько же , сколько хранится в ядре). См. Также: как solaris и bsd получают необработанные параметры командной строки для процесса и параметры ps
cat /proc/<pid>/cmdline
также работает на Cygwin, где аргументы строки cmd не отображаются ps
ни с одним параметром.
args
, ps -o args -p <pid>
она будет и будет печатать args
или использовать -o cmd
, только если вам нужно увидеть cmd
. Попытка чтения /proc/<pid>/cmdline
не всегда работает для непривилегированных пользователей. ps
Утилита будет работать.
/proc/<pid>/cmdline
ограничена (жестко запрограммирована на значение параметра ядра PAGE_SIZE), поэтому более длинные командные строки по-прежнему отображаются усеченными! См. Stackoverflow.com/questions/199130/… для получения дополнительной информации. Вы можете запросить настройки вашего ядра с помощью getconf PAGE_SIZE
, обычно это
Это сделает свое дело:
xargs -0 < /proc/<pid>/cmdline
Без xargs между аргументами не будет пробелов, потому что они были преобразованы в NUL.
xargs -0 < /proc/<pid>/cmdline
.
Для Linux & Unix System вы можете использовать, ps -ef | grep process_name
чтобы получить полную командную строку.
В системах SunOS, если вы хотите получить полную командную строку, вы можете использовать
/usr/ucb/ps -auxww | grep -i process_name
Чтобы получить полную командную строку, вам нужно стать суперпользователем.
pargs -a PROCESS_ID
предоставит подробный список аргументов, переданных процессу. Он выведет массив аргументов следующим образом:
argv[o]: first argument
argv[1]: second..
argv[*]: and so on..
Я не нашел подобной команды для Linux, но я использовал бы следующую команду, чтобы получить похожий вывод:
tr '\0' '\n' < /proc/<pid>/environ
В линуксе
cat /proc/<pid>/cmdline
Вы получите командную строку процесса (включая аргументы), но со всеми пробелами, замененными на символы NUL.
Вы можете использовать pgrep
с -f
(полная командная строка) и -l
(длинное описание):
pgrep -l -f PatternOfProcess
Этот метод имеет решающее значение с любым из других ответов: он работает на CygWin , так что вы можете использовать его , чтобы получить полную командную строку любого процесса , работающего под ОС Windows (выполняются как повышенные , если вы хотите данные о любом приподнятой процессе / администратора) , Любой другой способ сделать это в Windows более неудобен ( например ).
Более того: в моих тестах путь pgrep был единственной системой, которая работала для получения полного пути для скриптов, работающих внутри Python 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
и 3.3.12
. Просто печатает pid и prorgam name без аргументов.
Другой вариант печати /proc/PID/cmdline
с пробелами в Linux:
cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo
Таким образом cat
печатается символ NULL, а ^@
затем вы заменяете их пробелом sed
; echo
печатает новую строку.
В дополнение ко всем вышеперечисленным способам преобразования текста, если вы просто используете «строки», он по умолчанию выводит на отдельные строки. С дополнительным преимуществом это может также предотвратить появление любых символов, которые могут зашифровать ваш терминал.
Оба вывода в одну команду:
strings / proc // cmdline / proc // environment
Реальный вопрос заключается в том ... есть ли способ увидеть реальную командную строку процесса в Linux, которая была изменена так, чтобы командная строка содержала измененный текст вместо фактической команды, которая была выполнена.
В Linux, с bash, для вывода в виде заключенных в кавычки аргументов, чтобы вы могли отредактировать команду и повторно запустить ее
</proc/"${pid}"/cmdline xargs --no-run-if-empty -0 -n1 \
bash -c 'printf "%q " "${1}"' /dev/null; echo
На Solaris, с bash (протестировано с 3.2.51 (1) -релизом) и без пользовательского пространства 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 (вставить в терминал):
{
## 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
}
Вывод:
MATCH
Пример 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
}
Вывод:
MATCH
tr \\0 ' ' < /proc/<pid>/cmdline