pstree가 스크립트를 해석한 셸 이름 대신 스크립트 이름을 표시하는 이유는 무엇입니까?

pstree가 스크립트를 해석한 셸 이름 대신 스크립트 이름을 표시하는 이유는 무엇입니까?

다음과 같이 간단한 쉘 스크립트를 작성했습니다.

#!/bin/bash
sleep 90

이 셸을 실행한 후 pstree프로세스 트리 구조를 확인하기 위해 별도의 셸에서 실행했습니다.

이것이 내가 보는 것입니다

-gnome-terminal-+-bash---sleepy.sh---sleep

이 정도일 거라고 예상했는데

-gnome-terminal-+-bash---bash---sleep

쉘 스크립트가 pstree에 의해 프로세스로 표시되는 이유는 무엇입니까? 이 ps명령은 실행 중인 명령을 다음과 같이 올바르게 표시합니다.

10150  8771  0 08:13 pts/1    00:00:00 /bin/bash ./sleepy.sh

여기서 프로세스는 bash이고 sleepy.sh가 해당 매개변수입니다(저에게는 이해가 됩니다). 제가 보기에는 프로세스가 ELF(Executable Linkable Format Binary)여야 합니다. Bash는 ELF 실행 파일이지만 쉘 스크립트는 그렇지 않으므로 pstree그런 식으로 표시하면 안 된다고 생각합니까?

답변1

pstree 다음에서 프로세스 이름 검색/proc/<pid>/stat. 이것은 커널에 주어진 모든 것입니다통과하다 execve(2)첫 번째 매개변수를 참조하세요.proc(5)그리고쉘에서 파일을 실행하면 정확히 무슨 일이 발생합니까?더 알아보기. 후자에서 커널을 볼 수 있습니다할 수 있는쉘 스크립트(및 기타 여러 "바이너리")를 직접 실행하십시오.모노의 놀라운 점은 무엇인가요?) 그러나 쉘은 특정 상황에서도 개입합니다.

그래서 달리면

./sleepy.sh

스크립트 시작 부분에 쉘이 커널 실행을 요청하는 출력 sleepy.sh을 볼 수 있는 shebang 줄이 있습니다. pstree당신이 실행하는 경우

sh ./sleepy.sh

sh출력에서 이를 확인할 수 있습니다 .pstree

ps -f또는 ps u(및 pstree -a) 읽어서 /proc/<pid>/cmdline검색명령줄, 이는 다릅니다. 이는 argv시스템 호출에 전달된 매개변수 입니다 execve. shebang을 사용하여 쉘 스크립트를 실행하면 shebang을 포함하도록 변경됩니다. 이는 의심할 여지 없이 귀하의 사례가 ps표시되는 이유입니다.

/bin/bash ./sleepy.sh

(바라보다프로그램 작동 방식이에 대한 추가 정보).

관련 정보