Відповіді:
Є кілька варіантів:
ps -fp <pid>
cat /proc/<pid>/cmdline | sed -e "s/\x00/ /g"; echo
Більше інформації /proc/<pid>
про Linux, просто подивіться.
На інших Unixes речі можуть бути інакшими. ps
Команда буде працювати скрізь, то /proc
матеріал OS специфічні. Наприклад, на 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
, зазвичай це 4096.
Це зробить трюк:
xargs -0 < /proc/<pid>/cmdline
Без xargs не буде пробілів між аргументами, оскільки вони були перетворені на NUL.
xargs -0 < /proc/<pid>/cmdline
.
Для системи Linux та Unix ви можете використовувати 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
У Linux
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 без аргументів.
Ще один варіант друку /proc/PID/cmdline
з пробілами в Linux:
cat -v /proc/PID/cmdline | sed 's/\^@/\ /g' && echo
Таким чином cat
друкується NULL символів як, ^@
а потім ви замінюєте їх пробілом, використовуючи sed
; echo
друкує новий рядок
На додаток до всіх перерахованих вище способів перетворення тексту, якщо ви просто використовуєте "рядки", він за замовчуванням зробить вихід на окремих рядках. З додатковою перевагою, що це також може запобігти появі будь-яких символів, які можуть зашифрувати ваш термінал.
Обидва виведення в одній команді:
рядки / proc // cmdline / proc // середовище
Справжнє запитання полягає в тому, чи є спосіб побачити реальний командний рядок процесу в Linux, який був змінений так, щоб cmdline містив змінений текст замість фактично запущеної команди.
В 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) -release) і без 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
Приклад bash Linux (вставка в термінал):
{
## 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