일반화하다
mirage
shebang으로 시작하는 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/python
sum /usr/bin/mirage
이므로 python
sum 은 초기화된 내용 mirage
입니다 . /proc/self/comm
( comm
프로그램 이미지 파일 이름의 기본 이름이 잘리거나 채워집니다.)
매개변수 벡터는 프로세스의 내용을 초기화하고 /proc/self/cmdline
, 환경 벡터는 그 내용을 초기화합니다 /proc/self/environ
. 따라서 이러한 합계를 사용 /proc/self/comm
하고 프로그램이 실행되는 동안 이를 변경하지 않는다고 가정하면 전달된 세 가지 정보를 모두 알 수 있으므로 execve()
"프로세스가 처음에 시작된 방법"을 정확히 알 수 있습니다(엄격히 말하면 이것이 방법입니다).프로그램등이 출시되었습니다.프로세스)로 시작하세요 fork()
.
다음은 설명을 위해 작은 환경과 힘을 설정하기 위해 nosh 도구 세트에서 clearenv
및 를 사용하는 이 세 부분의 실제 예입니다 .setenv
exec
argv[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/sleep
3
exec
fexecve()
/proc/self/fd/3
프로그램 이미지 파일은 명명된 인터프리터와 #!
인터프리터가 프로그램 이미지 파일을 대체하고 인수 벡터를 이동하도록 하는 매직 넘버가 있는 스크립트입니다.변경 없음무엇이 들어가나요 comm
? 원래 제공된 프로그램 이미지 파일 이름은 그대로 유지됩니다 execve()
. 예, Linux는 여기서 일관성이 없습니다.하다이 경우 내용을 cmdline
유효한 최종 매개변수 문자열로 변경합니다.
추가 읽기
- https://unix.stackexchange.com/a/432681/5132
- https://unix.stackexchange.com/a/438007/5132
- https://unix.stackexchange.com/a/257568/5132
- https://unix.stackexchange.com/a/392600/5132
- 조나단 데보인 폴라드(2018). "
clearenv
". 수동. Nosh 툴셋. 소프트웨어. - 조나단 데보인 폴라드(2018). "
setenv
". 수동. Nosh 툴셋. 소프트웨어. - 조나단 데보인 폴라드(2018). "
exec
". 수동. Nosh 툴셋. 소프트웨어.