추가 읽기

추가 읽기

일반화하다

mirageshebang으로 시작하는 Python 프로그램을 예로 들어 보겠습니다 .

#!/usr/bin/python
...

보거나 /proc/<pid>/comm사용하는 pgrep모습은...

...shebang을 통해 호출하면 프로세스 이름은 "mirage"입니다.

/usr/bin/mirage &

...하지만 명시적으로 Python을 호출하면 "python"이 됩니다.

/usr/bin/python /usr/bin/mirage &
  • 프로세스가 자체 이름을 변경할 수 있다는 것을 알고 있지만 두 경우의 이름이 다른 이유는 무엇입니까?
  • /proc프로세스가 처음에 시작되는 방식(단지 사용 또는 grep정보 사용) 을 이해하는 일반적인 방법이 있습니까 ?

세부정보-셰본

/home/martin> /usr/bin/mirage &
[1] 22638

/proc/<pid>/comm그것을 '신기루'라고 불러라.

/home/martin> cat /proc/22638/comm 
mirage

패키지"신기루"인 것으로 확인되었지만 "파이썬"은 아닙니다.

/home/martin> pgrep -al mirage && echo "found" || echo "not found"
22638 /usr/bin/python /usr/bin/mirage
found

/home/martin> pgrep -al python && echo "found" || echo "not found"
not found

세부정보 - 파이썬

/home/martin> /usr/bin/python /usr/bin/mirage &
[1] 21348

/proc/<pid>/comm"파이썬"이라고 부르세요

/home/martin> cat /proc/21348/comm 
python

패키지"python"이지만 "mirage"는 아닌 것으로 나타났습니다.

/home/martin> pgrep -al mirage && echo "found" || echo "not found"
not found

/home/martin> pgrep -al python && echo "found" || echo "not found"
21348 /usr/bin/python /usr/bin/mirage
found

답변1

프로세스 이름은 argv[0]호출 에서 파생됩니다 execv().

이는 관찰한 동작을 설명합니다.

실제로 shebang의 경우 커널은 벡터에 영향을 주지 않고 호출되는 방식을 재정렬합니다 argv.

답변2

프로세스가 자체 이름을 변경할 수 있다는 것을 알고 있지만 두 경우의 이름이 다른 이유는 무엇입니까?

관련된 절차가 다르기 때문에아니요이름을 바꾸세요. Linux의 기본 동작에 따라 할당된 이름이 지정됩니다. (다른 운영 체제는 다르게 동작하지만 이것은 파일에 관한 것이므로 Linux 질문입니다 /proc/*/comm.)

Linux에서 프로그램 이름은 comm다음 중 하나에서 가져옵니다.프로그램 이미지 파일전달된 이름은 execve()다음과 같습니다. 이 점에 유의하시기 바랍니다아니요인수 벡터 또는 환경 벡터이며 Linux의 인수 벡터에서 이름을 가져왔다는 내용이 올바르지 않습니다.

쉘이 실제로 전달한 프로그램 이미지 파일 이름은 /usr/bin/pythonsum /usr/bin/mirage이므로 pythonsum 은 초기화된 내용 mirage입니다 . /proc/self/comm( comm프로그램 이미지 파일 이름의 기본 이름이 잘리거나 채워집니다.)

매개변수 벡터는 프로세스의 내용을 초기화하고 /proc/self/cmdline, 환경 벡터는 그 내용을 초기화합니다 /proc/self/environ. 따라서 이러한 합계를 사용 /proc/self/comm하고 프로그램이 실행되는 동안 이를 변경하지 않는다고 가정하면 전달된 세 가지 정보를 모두 알 수 있으므로 execve()"프로세스가 처음에 시작된 방법"을 정확히 알 수 있습니다(엄격히 말하면 이것이 방법입니다).프로그램등이 출시되었습니다.프로세스)로 시작하세요 fork().

다음은 설명을 위해 작은 환경과 힘을 설정하기 위해 nosh 도구 세트에서 clearenv및 를 사용하는 이 세 부분의 실제 예입니다 .setenvexecargv[0]

%clearenv setenv 1THIS '환경 문자열입니다.' setenv 2COMPRISING '모든 환경입니다. \
> exec -a 'argv[0]입니다. ' /bin/sleep 100 &
[1]15564
% for i in /proc/$\!/{comm,cmdline,environ} ; printf "%s:" $i 실행 printf "\n" ;
/proc/15564/통신:3

/proc/15564/cmdline:argv[0]입니다.^@100^@
/proc/15564/environ:1THIS=환경 문자열^@2COMPRISING=모든 환경. ^@
%

실제로 이는 exec. ​( 내부적으로 폼 프로그램 이미지 파일명을 사용하는 C 라이브러리 함수를 사용 하기 때문이다 .)execve()/bin/sleep3execfexecve()/proc/self/fd/3

프로그램 이미지 파일은 명명된 인터프리터와 #!인터프리터가 프로그램 이미지 파일을 대체하고 인수 벡터를 이동하도록 하는 매직 넘버가 있는 스크립트입니다.변경 없음무엇이 들어가나요 comm? 원래 제공된 프로그램 이미지 파일 이름은 그대로 유지됩니다 execve(). 예, Linux는 여기서 일관성이 없습니다.하다이 경우 내용을 cmdline유효한 최종 매개변수 문자열로 변경합니다.

추가 읽기

관련 정보