다음과 같이 간단한 쉘 스크립트를 작성했습니다.
#!/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
(바라보다프로그램 작동 방식이에 대한 추가 정보).