쉘 스크립트를 실행하여 환경 변수가 상위 프로세스에서 하위 프로세스로 상속된 zsh
다음 pstree <username>
상속 트리를 보는 데 사용되는 방법을 이해하기 위해 몇 가지 실험을 수행하고 있습니다.
나는 zsh가 스크립트를 실행하기 위해 포크를 할 것이라고 생각합니다. 하지만 pstree의 프로세스 이름은 .dll이 아닌 스크립트 파일 이름입니다 zsh
.
#parent.sh
#! /bin/zsh
export AMA=1
./childEcho.sh #call child
#childEcho.sh
#! /bin/zsh
echo ${AMA}
./subchild.sh #call sub_child
#subchild.sh
#! /bin/zsh
echo ${AMA}
sleep 5d #sleep so that pstree can see the process tree
그럼 pstree
보여줘
sshd───zsh───parent.sh───childEcho.sh───subchild.sh───sleep
그런 다음 스크립트에서 hashbang 헤더를 제거하고 다시 실행한 후 전달하면 다음과 같은 결과를 pstree
얻습니다.
sshd───zsh───sh───sh───sh───sleep
이제 프로세스는 스크립트 파일 이름 대신 sh입니다.
- 왜 우리는 다르게 행동합니까?
- pstree는 어떻게 프로세스 이름을 결정하고 트리를 그리나요?
- 런타임 중에 프로세스 이름이 변경되었습니까?
답변1
프로그램은 자체 명령줄을 변경할 수 있습니다( ps
CMD 열 또는 에 표시된 대로 pstree
). 이것이 zsh가 수행하는 작업입니다. 아마도 명령 이름을 쉘 스크립트로 변경하여 ps
.
예를 들어 (zsh가 아닌 bash를 사용하고 있지만 zsh에서도 잘 작동합니다. 테스트했습니다):
$ perl -E '$0 = "I AM PERL"; sleep(60);' &
[1] 504
$ ps 504
PID TTY STAT TIME COMMAND
504 pts/22 S 0:00 I AM PERL
readlink /proc/PID/exe
적어도 Linux에서는 를 통해 실제 실행 파일을 얻을 수 있습니다 .