Як отримати аргументи командного рядка передані до запущеного процесу в системах unix / linux?


202

У SunOS є pargsкоманда, яка друкує аргументи командного рядка, передані в запущений процес.

Чи є якась подібна команда в інших середовищах Unix?


4
tr \\0 ' ' < /proc/<pid>/cmdline
Дмитро Григор’єв

Відповіді:


307

Є кілька варіантів:

ps -fp <pid>
cat /proc/<pid>/cmdline | sed -e "s/\x00/ /g"; echo

Більше інформації /proc/<pid>про Linux, просто подивіться.

На інших Unixes речі можуть бути інакшими. psКоманда буде працювати скрізь, то /procматеріал OS специфічні. Наприклад, на AIX немає cmdlineв /proc.


49
у Linux вам, мабуть, знадобиться –ww (тобто ps -ww -fp <pid>) для введення широкого виводу, оскільки якщо є кілька команд, вони можуть бути відрізані.
Silfheed

2
-wwопція дозволяє отримати доступ до повних аргументів командного рядка (стільки ж , скільки зберігається в ядрі). Дивіться також: як solaris і bsd отримують невчене параметри командного рядка для процесу та параметрів ps
GuruM

3
cat /proc/<pid>/cmdlineтакож працює на Cygwin, де аргументи рядків cmd не показані psжодним параметром.
lechup

3
У Linux, якщо вам потрібно лише отримати команду args, команда є, ps -o args -p <pid>і вона буде друкувати argsабо використовувати -o cmdлише тоді, коли вам потрібно переглянути cmd. Намагання читати /proc/<pid>/cmdlineне завжди допоможе непривілейованим користувачам. psУтиліта буде працювати.
alvits

2
Підказка: довжина /proc/<pid>/cmdlineобмежена (жорстко закодовано значення параметра PAGE_SIZE ядра), тому довші командні рядки все ще відображаються усіченими! Дивіться stackoverflow.com/questions/199130/… для отримання додаткової інформації. Ви можете запитати налаштування свого ядра getconf PAGE_SIZE, зазвичай це 4096.
t0r0X,

61

Це зробить трюк:

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

Без xargs не буде пробілів між аргументами, оскільки вони були перетворені на NUL.


3
Це можна скоротити до xargs -0 < /proc/<pid>/cmdline.
slm

Це стильно обрізання мого результату. Будь-яка порада?
johnsam

Ніколи не помічав жодного усічення - чи можна навести приклад?
Майкл Бёклінг

Таким чином, ви не можете сказати, чи це вбудований простір або межа аргументу.
ivan_pozdeev

19

Повний командний рядок

Для системи 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

14

У Linux

cat /proc/<pid>/cmdline

отримати вам командний рядок процесу (включаючи аргументи), але з усіма пробілами змінено на символи NUL.


3
Пробіл не видалено, він замінено на NUL.
bdonlan

@bdonlan Ах, я цього не перевіряв. Гарний улов!
lothar

4
xargs -0 відлуння </ proc / <pid> / cmdline. Ви також можете це зробити за допомогою / proc / <pid> / environment, хоча ви можете додати для цього -n 1.
camh

У моїй системі немає / proc файлової системи :( будь-яке інше рішення?
Hemant

Шахта - це процес Java з довгими довгими параметрами. Це стильно обрізання мого результату. Будь-яка порада?
johnsam

14

Ви можете використовувати 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 без аргументів.
Socowi

4

Ще один варіант друку /proc/PID/cmdlineз пробілами в Linux:

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

Таким чином catдрукується NULL символів як, ^@а потім ви замінюєте їх пробілом, використовуючи sed; echoдрукує новий рядок


FYI, ви також можете використовувати cat -v / proc / PID / cmdline | sed 's / \ ^ @ / \ n / g' . Це замінить нульовий символ новим рядком. При цьому кожен аргумент буде надрукований у власний рядок. Таким чином, простіше розповісти один аргумент від іншого.
TSJNachos117


2

Замість того, щоб використовувати кілька команд для редагування потоку, просто використовуйте one - tr перекладає один символ на інший:

tr '\0' ' ' </proc/<pid>/cmdline

1

На додаток до всіх перерахованих вище способів перетворення тексту, якщо ви просто використовуєте "рядки", він за замовчуванням зробить вихід на окремих рядках. З додатковою перевагою, що це також може запобігти появі будь-яких символів, які можуть зашифрувати ваш термінал.

Обидва виведення в одній команді:

рядки / proc // cmdline / proc // середовище

Справжнє запитання полягає в тому, чи є спосіб побачити реальний командний рядок процесу в Linux, який був змінений так, щоб cmdline містив змінений текст замість фактично запущеної команди.


1

На Соляріс

     ps -eo pid,comm

подібне може бути використане в unix-подібних системах.


1

В 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

0

Якщо ви хочете отримати якомога довший (не впевнений, які обмеження існують), подібний до парг Solaris , ви можете використовувати це в Linux & OSX:

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

-1

спробуйте ps -nв терміналі Linux. Це покаже:

1. Усі процеси RUNNING , їх командний рядок та їх PID

  1. Програма ініціює процеси.

Згодом ви дізнаєтеся, який процес вбити

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.