나는 Ubuntu에서 다음과 같은 스크립트를 작성하고 있습니다 bash
.test.sh
#!/bin/bash
while true; do
echo 'abc' # pwd, df...
sleep 1
done
한 터미널에서 실행하면 ./test.sh
다른 터미널을 열어 다음 명령을 실행합니다.
$ pgrep test
31110
$ ps -ef | grep sleep
me 31140 31110 0 20:58 pts/1 00:00:00 sleep 1
me 31142 16389 0 20:58 pts/0 00:00:00 grep --color=auto sleep
$ ps -ef | grep sleep
me 31146 31110 0 20:58 pts/1 00:00:00 sleep 1
me 31148 16389 0 20:58 pts/0 00:00:00 grep --color=auto sleep
$ ps -ef | grep sleep
me 31150 31110 0 20:58 pts/1 00:00:00 sleep 1
me 31152 16389 0 20:58 pts/0 00:00:00 grep --color=auto sleep
따라서 프로세스의 PID ./test.sh
는 입니다 31110
. 명령을 실행할 때 이 프로세스의 모든 자식인 많은 프로세스 (PID는 ,, ... ) ps -ef | grep sleep
를 얻습니다 .sleep 1
31140
31146
31150
./test.sh
좋아, 이제 모든 것을 이해할 수 있는 것 같습니다. 하위 프로세스는 sleep 1
루프 에서 나옵니다 while true
.
그러나 시도하면 ps -ef | grep echo
아무것도 얻지 못합니다. 등 pwd
의 다른 명령도 실행해 보았 df
으나 편집에 실패했습니다 grep
.
그래서 내 질문은 왜 이 명령 sleep
은 별도의 프로세스이고 다른 명령은 그렇지 않은가입니다.
답변1
여기서 고려해야 할 두 가지 측면이 있습니다.
echo
실제로 는 쉘의 내장 명령pwd
이므로 별도의 프로세스로 표시할 수 없습니다 (예를 들어 출력을 참조 하세요.bash
type echo
할 수 있다외부 실행 파일로 잘 구현되며 내장 또는 외부 프로그램으로 구현되거나 구현되지 않는 것은 쉘마다 다릅니다.df
반면에 셸에서 실행되는 명령은 외부 실행 파일(예:)을 호출합니다.예별도의 프로세스이지만 일반적으로 너무 빨리 완료되므로 "잡기"가 어렵습니다ps
(즉,ps
시작 시 이미 완료되었으므로 출력에 표시되지 않습니다).
답변2
sleep
Bash는 기본적으로 내장 버전을 제공하지 않기 때문에 외부 프로세스입니다. 프로그램이 거의 단일 시스템 호출만 실행하기 때문에 이는 어렵지 않지만 구현 간에 차이가 있으며 일부는 정수 값으로 제한되지 않고 일부는 m
분 등과 같은 지정자가 필요합니다.
df
그리고 ps
일반적으로 외부 프로세스도 있습니다. df
너무 빨리 실행되어 포착할 수 없을 수도 있지만(내 시스템에서는 실행하는 데 0.003초가 걸리는 것으로 표시됨) time df
출력에는 거의 확실하게 프로세스 자체도 포함되어 있습니다.ps
ps
ps -ef |grep ps
반면에 은 Bash에 내장되어 echo
있으며 pwd
예를 들어 다음을 실행하여 알 수 있습니다 type echo
. 라고 말해야합니다 echo is a shell builtin
. 둘 다 필요하지 않으며 종종 사용 가능합니다 /bin/echo
( /bin/pwd
또는 /usr/bin/
시스템에 있는 경우 별도로 /bin
) /usr/bin
. pwd
현재 작업 디렉토리가 하위 프로세스에 상속되므로 외부일 수 있습니다. 반면에,cd
할 수 없다, 작업 디렉터리를 변경해도 상위 프로세스에는 영향을 주지 않기 때문입니다.
sleep
내부적으로 df
, 등을 구현하는 쉘을 가질 수도 있습니다 ps
. cp
예를 들어 Busybox에는 이러한 모든 구현이 포함되어 있습니다. 그러나 내 시스템의 프로세스는 여전히 다른 프로세스를 분기하여 실행합니다 sleep
(그러나 그렇게 하지 않는 것 같습니다 df
).
답변3
짧은 대답: 시스템이 그렇게 설계되었기 때문입니다. 오래 전에 Unix를 설계한 사람들은 어떤 명령이 내부 명령(셸 자체에 의해 식별되고 실행되는지)과 외부 명령(별도의 바이너리/프로세스를 통해 실행)을 결정해야 했습니다.
cd
, pwd
또는 같은 특정 명령은 set
쉘의 내부 상태를 참조하므로 외부 프로세스에서 실행할 수 없으므로 내부 명령이어야 합니다. 대부분의 다른 명령과 마찬가지로 디자이너는 명령이 내부 명령인지 외부 명령인지 선택할 수 있습니다. 실제로 이는 셸마다 다릅니다.
echo
예를 들어, 외부 명령인 일부 오래된 시스템/셸이 있습니다 . 요즘 거의 모든 쉘에는 내부 명령이 있지만 호환성상의 이유로 echo
전통적인 외부 명령이 여전히 존재합니다(적어도 Linux에서는)./bin/echo
다른 답변에서 언급했듯이 명령 type
(예를 들어 분명히 내부 명령이어야 함 cd
)을 사용하면 어떤 명령이 내부 명령이고 어떤 명령이 외부 명령인지 확인할 수 있습니다.
raj@rafa:~$ type echo
echo is a shell builtin
raj@rafa:~$ type df
df is hashed (/bin/df)
raj@rafa:~$ type ps
ps is /bin/ps
raj@rafa:~$
"df is hashed" 메시지에 주목하십시오. 이는 해당 df
명령이 이 쉘 세션에서 사용되었음을 의미하므로 쉘은 해당 위치를 기억하고 실행하려고 할 때 디스크에서 다시 검색할 필요가 없습니다. 반면, ps
이 세션에서는 사용되지 않았으므로 명령은 해당 경로만 표시합니다.