유닉스 / 리눅스 시스템에서 실행중인 프로세스로 커맨드 라인 인수를 얻는 방법?


202

SunOS에는 pargs실행중인 프로세스에 전달 된 명령 행 인수를 인쇄하는 명령이 있습니다.

다른 유닉스 환경에서도 비슷한 명령이 있습니까?


4
tr \\0 ' ' < /proc/<pid>/cmdline
Dmitry Grigoryev

답변:


307

몇 가지 옵션이 있습니다.

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

/proc/<pid>리눅스 에는 더 많은 정보가 있습니다 .

다른 유닉스에서는 상황이 다를 수 있습니다. 이 ps명령은 모든 곳에서 작동하며, /proc운영 체제에 따라 다릅니다. AIX에 예를 들어 전혀 없다 cmdline에서 /proc.


49
리눅스에서는 ps -ww -fp <pid>여러 명령이 있으면 잘릴 수 있으므로 넓은 출력을 지정 하려면 -ww (예 :)가 필요할 것입니다 .
Silfheed

2
-ww옵션을 사용하면 커널이 저장 한 전체 명령 줄 인수에 액세스 할 수 있습니다. 참조 : solaris 및 bsd가 프로세스ps 옵션에 대해
잘리지 않은

3
cat /proc/<pid>/cmdlinecmd 줄 인수가 ps옵션으로 표시되지 않는 Cygwin에서도 작동합니다 .
lechup

3
Linux 에서을 가져와야하는 경우 args명령은 이며을 볼 필요가있는 경우 -o 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으로 조회 할 수 있습니다 . 일반적으로 4096입니다.
t0r0X

61

이것은 트릭을 할 것입니다 :

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

xargs가 없으면 인수 사이에 공백이 없습니다. 인수가 NUL로 변환 되었기 때문입니다.


3
이를 단축 할 수 있습니다 xargs -0 < /proc/<pid>/cmdline.
slm

여전히 출력을 자르고 있습니다. 조언이 있습니까?
johnsam

잘림이 발견되지 않았습니다. 예를 들어 주시겠습니까?
마이클 Böckling

이렇게하면 인라인 공간인지 또는 인수 경계인지 말할 수 없습니다.
ivan_pozdeev

19

전체 명령 줄

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

14

리눅스

cat /proc/<pid>/cmdline

프로세스의 명령 줄 (args 포함)이지만 모든 공백이 NUL 문자로 변경되었습니다.


3
공백은 제거되지 않고 NUL로 대체됩니다.
bdonlan

@ bdonlan 아, 나는 그것을 확인하지 않았다. 잘 잡아!
lothar 2016

4
xargs -0 echo </ proc / <pid> / cmdline. / proc / <pid> / environ을 사용하여이 작업을 수행 할 수도 있지만 -n 1을 추가 할 수도 있습니다.
camh

내 시스템에는 / proc 파일 시스템이 없습니다 :( 다른 솔루션?
Hemant

광산은 길고 긴 매개 변수가있는 Java 프로세스입니다. 여전히 출력을 자르고 있습니다. 조언이 있습니까?
johnsam

14

(전체 명령 행) 및 (자세한 설명) 과 pgrep함께 사용할 수 있습니다 .-f-l

pgrep -l -f PatternOfProcess

이 방법은 다른 응답과 결정적인 차이가 있습니다. CygWin 에서 작동 하므로 Windows에서 실행되는 모든 프로세스의 전체 명령 줄을 얻는 데 사용할 수 있습니다 ( 상승 / 관리 프로세스에 대한 데이터를 원하는 경우 상승으로 실행 ) . Windows 에서이 작업을 수행하는 다른 방법은 더 어색합니다 ( :) .
또한 내 테스트에서 pgrep 방식은 CygWin의 python 내에서 실행되는 스크립트 의 전체 경로를 얻는 유일한 시스템 이었습니다 .


이것은 실제로 원래 실행 파일 이름도 인쇄합니다.$ exec -a fakename bash & [1] 14102 [1]+ Stopped exec -a fakename bash $ xargs -0 < /proc/14102/cmdline; fakename $ pgrep -l -f fakename; 14102 bash
unhammer

pgrep from procps-ng 3.3.15and 사용하여 작동하지 않습니다 3.3.12. 인수없이 pid와 prorgam 이름을 인쇄합니다.
Socowi

4

/proc/PID/cmdlineLinux에서 공백 으로 인쇄 하는 또 다른 변형은 다음 과 같습니다.

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

이런 식으로 NULL 문자를 그대로 cat인쇄 한 다음 ;를 사용하여 공백으로 대체합니다 . 줄 바꿈을 인쇄합니다.^@sedecho


참고로 cat -v / proc / PID / cmdline | sed 's / \ ^ @ / \ n / g' . 이것은 널 문자를 개행 문자로 대체합니다. 이렇게하면 각 인수가 자체 줄에 인쇄됩니다. 그렇게하면 한 가지 주장을 다른 주장에서 말하는 것이 더 쉽습니다.
TSJNachos117

2

간단하게 사용할 수 있습니다 :

ps -o args= -f -p ProcessPid

2

스트림을 편집하기 위해 여러 명령을 사용하는 대신 하나만 사용하십시오. tr은 한 문자를 다른 문자로 변환합니다.

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

1

위의 모든 텍스트 변환 방법 외에도 단순히 '문자열'을 사용하면 기본적으로 별도의 줄에 출력됩니다. 추가 혜택으로 터미널을 뒤섞을 수있는 문자가 표시되지 않을 수도 있습니다.

하나의 명령으로 두 출력 :

문자열 / proc // cmdline / proc // environ

진짜 질문은 ... cmdline이 실행 된 실제 명령 대신 변경된 텍스트를 포함하도록 Linux에서 변경된 프로세스의 실제 명령 줄을 보는 방법이 있습니까?


1

Solaris에서

     ps -eo pid,comm

유닉스 계열 시스템에서 비슷한 것을 사용할 수 있습니다.


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) 릴리스로 테스트) 및 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

리눅스 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

솔라리스 배쉬 예제 :

{
## 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의 pargs 와 유사하게 가능한 오래 사용할 수있는 제한이 무엇인지 알고 싶다면 Linux 및 OSX에서 사용할 수 있습니다.

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

-1

ps -n리눅스 터미널을 사용해보십시오 . 이것은 보여줄 것이다 :

1. 모든 프로세스 RUNNING , 명령 줄 및 PID

  1. 프로그램이 프로세스를 시작합니다.

나중에 당신은 죽일 프로세스를 알게 될 것입니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.