ps -e 프로세스 이름을 소문자로 변환

ps -e 프로세스 이름을 소문자로 변환

ps -e대문자 프로세스 이름을 소문자로 변환합니다. 매뉴얼 페이지나 온라인에서 이 동작에 대한 설명을 찾을 수 없으며, 이를 파악하기 위해 소스 코드를 읽는 데 능숙하지 않습니다.

나는 보통 ps -ef(전체 형식 목록)을 사용하므로 이 동작을 전혀 눈치채지 못했지만 DBA는 알아차렸습니다.

-e소문자는 흐름선에 대해 예상되는 동작입니까? 왜 소문자로 인코딩되었는지 설명할 수 있는 사람이 있나요?

다음은 동일한 프로세스의 예입니다. 단, -e및 then 을 사용하는 경우는 다음과 같습니다 -ef.

server ~> ps -e | grep -Ei pmon
2187719 ?        00:00:02 ora_pmon_foobar
2188497 ?        00:00:02 ora_pmon_phuuba
2188928 ?        00:00:02 ora_pmon_kilgor
[printed as lowercase when instance name (end of line) should be uppercase ]

server ~> ps -ef | grep -Ei pmon
oracle   2187719       1  0 04:00 ?        00:00:02 ora_pmon_FOOBAR
oracle   2188497       1  0 04:00 ?        00:00:02 ora_pmon_PHUUBAR
oracle   2188928       1  0 04:01 ?        00:00:02 ora_pmon_KILGORE
[prints upper case, which is good]

-e혼자서도 잘립니다. 하지만 그것이 바로 우리가 얻는 것입니다 -f. 주로 -e소문자 프로세스에 대해 궁금합니다.

답변1

ps-f열에 다른 정보를 제공 하거나 제공하지 않습니다 CMD.

리눅스에서는,

  • -f 없이,이것은프로세스 이름. 프로세스 속성, 길이는 15바이트로 제한됩니다. 이 속성은 명령을 실행하는 데 사용되는 시스템 호출에 의해 execve()실행 중인 파일의 기본 이름으로 설정되며 15바이트로 잘리고 프로세스에서도 사용할 수 있습니다 prctl(PR_SET_NAME). 반환된 것과 동일한 결과입니다 ps -o comm. /proc/pid/stat사내 (...)또는 현장에서 Name:볼 수 있습니다 /proc/pid/status.
  • -f 사용,이것은매개변수 목록공백 문자로 연결합니다. 이는 명령(또는 해당 조상)을 실행한 프로세스의 시스템 호출 argv[0]에 두 번째 인수로 전달된 인수(포함)입니다. execve()인수 목록은 NUL로 구분되어 볼 수 있습니다 /proc/pid/cmdline. 반환된 것과 동일한 결과입니다 ps -o args. 이전에는 4096바이트로 잘렸지만 최신 버전의 Linux에서는 더 이상 그렇지 않습니다( ps옵션이 제공되지 않으면 출력을 위해 자체적으로 잘립니다 -w). 프로세스는 정보가 발견된 스택 부분에 새 텍스트를 작성하여 이를 변경할 수 있습니다(제한 있음).

/proc/pid/exe또한 프로세스가 현재 실행 중인 실행 파일(보고된 대로 ps -o exe)에 대한 심볼릭 링크가 되며, 이는 다를 수도 있습니다.

그럼에도 불구하고 인쇄할 수 없는 문자를 이스케이프하는 것 외에는 ps이러한 문자에 대한 변환이 수행되지 않습니다 .

다음을 실행할 수 있습니다.

ps -wwo comm,args,exe -p 2187719

ID가 2187719인 프로세스의 프로세스 이름, 매개변수 목록 및 실행 파일을 보려면 ps다음을 사용하여 이 정보를 얻은 원본 소스를 확인할 수 있습니다 .

cat /proc/2187719/stat
sed -n l /proc/2187719/cmdline
readlink /proc/2187719/exe

예:

$ cp /usr/bin/sleep 'A longer sleep command for demonstration'
$ (exec -a 'SLEEP though could be anything' './A longer sleep command for demonstration' Infinity) &
[1] 6723
$ ps -fp "$!"
UID          PID    PPID  C STIME TTY          TIME CMD
chazelas    6723    6668  0 06:17 pts/2    00:00:00 SLEEP though could be anything Infinity
$ ps -p "$!"
    PID TTY          TIME CMD
   6723 pts/2    00:00:00 A longer sleep
$ cat "/proc/$!/stat"
6723 (A longer sleep ) S 6668 6723 6668 34818 6726 4194304 154 0 0 0 0 0 0 0 25 5 1 0 17863 19312640 448 18446744073709551615 94858855174144 94858855192393 140731919224688 0 0 0 0 0 0 1 0 0 17 0 0 0 0 0 0 94858855206160 94858855207424 94858855886848 140731919232547 140731919232587 140731919232587 140731919237069 0
$ sed -n /Name/l "/proc/$!/status"
Name:\tA longer sleep $
$ sed -n l "/proc/$!/cmdline"
SLEEP though could be anything\000Infinity\000$
$ perl -e '$0 = "whatever you want"; sleep 20' &
[1] 13861
$ ps -wo comm,args,exe -p "$!"
COMMAND         COMMAND                     EXE
whatever you wa whatever you want           /usr/bin/perl

귀하의 경우 상황이 다르다면 다음과 같은 이유일 수 있습니다.

  • 이러한 과정이 이루어졌습니다execve("/path/to/ora_pmon_foobar", ["ora_pmon_FOOBAR", NULL], envlist);
  • 그들은 그렇게 했지만 execve("/path/to/anything", ["ora_pmon_FOOBAR", NULL], envlist)( anything아마도 그랬을 것입니다 ora_pmon_FOOBAR), 그런 다음 하나를 만들었습니다 prctl(PR_SET_NAME, "ora_pmon_foobar").
  • 그들은 그렇게 했지만 execve("/path/to/ora_pmon_foobar", ["ora_pmon_foobar", NULL], envlist);그 다음에 argv[0]ora_pmon_FOOBAR.

또는 위의 조합입니다. 예를 들어, 위의 예에 표시된 것처럼 perl에 할당하면 $0프로세스 이름과 인수 목록이 모두 변경됩니다.


execve()두 번째 인수로 빈 목록이 있는 프로세스(결과 == 0) 또는 해당 인수 목록이 비어 있는 경우 또는 해당 인수 목록이 비어 있지 않은 경우 1입니다. 또는 해당 인수 목록 이 커널 작업으로 호출된 argc적이 없는 프로세스에 의해 호출됩니다. execve(). 이 경우 ps -f프로세스/작업 이름은 대괄호 안에 표시됩니다.

관련 정보