쉘 스크립트 프로세스 포크

쉘 스크립트 프로세스 포크

쉘 스크립트를 실행하여 환경 변수가 상위 프로세스에서 하위 프로세스로 상속된 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입니다.

  1. 왜 우리는 다르게 행동합니까?
  2. pstree는 어떻게 프로세스 이름을 결정하고 트리를 그리나요?
  3. 런타임 중에 프로세스 이름이 변경되었습니까?

답변1

프로그램은 자체 명령줄을 변경할 수 있습니다( psCMD 열 또는 에 표시된 대로 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에서는 를 통해 실제 실행 파일을 얻을 수 있습니다 .

관련 정보