이 스크립트
$ cat csub.sh
#!/bin/bash
while true;
do
sleep 5
AVAR=$(date; sleep 2)
done
시작 시 프로세스가 ps 출력에 표시되도록 합니다.
ps -eLf|egrep '[c]sub.sh|PID'
UID PID PPID LWP C NLWP STIME TTY TIME CMD
jimmy 31364 23445 31364 0 1 00:33 pts/7 00:00:00 /bin/bash ./csub.sh
이는 완전히 예측 가능하며 $(date; sleep 2)
실제로 다른 프로세스를 생성합니다.
놀랍게도 생성된 프로세스는 다음과 같습니다.정확히 똑같다표시 명령
UID PID PPID LWP C NLWP STIME TTY TIME CMD
jimmy 31364 23445 31364 0 1 00:33 pts/7 00:00:00 /bin/bash ./csub.sh
jimmy 31433 31364 31433 0 1 00:33 pts/7 00:00:00 /bin/bash ./csub.sh
ps 출력에 프로세스를 캡처할 수 있도록 절전 모드를 추가했습니다. 그렇지 않으면 너무 짧기 때문에 기회가 훨씬 줄어들 것입니다. 보시다시피 생성된 프로세스 31433은 상위 프로세스로 31364를 갖습니다. 생성된 프로세스에 날짜 또는 절전 명령과 같이 처리하는 내용을 언급하는 다른 CMD가 있기를 바랍니다. 여러 명령 대체가 있는 경우 생성된 프로세스가 나타나는 것을 어떻게 구별할 수 있습니까?
답변1
매뉴얼 페이지의 2부에서 fork()
:
fork()
호출 프로세스를 복사하여 새 프로세스를 만듭니다. 새 프로세스(하위 프로세스라고 함)는 다음을 제외하고 호출 프로세스(상위 프로세스라고 함)와 동일합니다.
- 하위 프로세스에는 고유한 프로세스 ID가 있으며 해당 PID는 기존 프로세스 그룹( )의 ID와 일치하지 않습니다
setpgid(2)
.- 하위 프로세스의 상위 프로세스 ID는 상위 프로세스 ID와 동일합니다.
- 자식 프로세스는 부모의 메모리 잠금(
mlock(2)
,mlockall(2)
)을 상속하지 않습니다.- 하위 프로세스의 프로세스 자원 사용률(
getrusage(2)
) 및 CPU 시간 카운터( )times(2)
가 0으로 재설정됩니다.- 자식의 보류 중인 신호 집합은 처음에는 비어 있습니다(
sigpending(2)
).semop(2)
하위 항목은 상위 항목( )으로부터 세마포어 조정을 상속받지 않습니다 .fcntl(2)
하위 항목은 상위 항목( )으로부터 레코드 잠금을 상속받지 않습니다 .setitimer(2)
자식은 부모( ,alarm(2)
, )로부터timer_create(2)
타이머를 상속받지 않습니다 .aio_read(3)
하위 항목은 상위 항목으로부터 처리되지 않은 비동기 I/O 작업( , ) 을 상속하지 않으며aio_write(3)
상위 항목으로부터 비동기 I/O 컨텍스트도 상속하지 않습니다( 참조io_setup(2)
).
프로세스의 호출 명령줄은 이 목록에 없으므로 상위 프로세스와 동일합니다. 하위 프로세스의 PPID(상위 프로세스 PID)가 원래 프로세스의 PID가 되므로 하위 프로세스와 상위 프로세스를 구별할 수 있습니다.