쉘 스크립트에서 사용될 때 sleep 명령이 별도의 프로세스로 나타나는데 다른 명령은 그렇지 않은 것처럼 보이는 이유는 무엇입니까?

쉘 스크립트에서 사용될 때 sleep 명령이 별도의 프로세스로 나타나는데 다른 명령은 그렇지 않은 것처럼 보이는 이유는 무엇입니까?

나는 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 1311403114631150./test.sh

좋아, 이제 모든 것을 이해할 수 있는 것 같습니다. 하위 프로세스는 sleep 1루프 에서 나옵니다 while true.

그러나 시도하면 ps -ef | grep echo아무것도 얻지 못합니다. 등 pwd의 다른 명령도 실행해 보았 df으나 편집에 실패했습니다 grep.

그래서 내 질문은 왜 이 명령 sleep은 별도의 프로세스이고 다른 명령은 그렇지 않은가입니다.

답변1

여기서 고려해야 할 두 가지 측면이 있습니다.

  1. echo실제로 는 쉘의 내장 명령 pwd이므로 별도의 프로세스로 표시할 수 없습니다 (예를 들어 출력을 참조 하세요.bashtype echo할 수 있다외부 실행 파일로 잘 구현되며 내장 또는 외부 프로그램으로 구현되거나 구현되지 않는 것은 쉘마다 다릅니다.
  2. df반면에 셸에서 실행되는 명령은 외부 실행 파일(예:)을 호출합니다.별도의 프로세스이지만 일반적으로 너무 빨리 완료되므로 "잡기"가 어렵습니다 ps(즉, ps시작 시 이미 완료되었으므로 출력에 표시되지 않습니다).

답변2

sleepBash는 기본적으로 내장 버전을 제공하지 않기 때문에 외부 프로세스입니다. 프로그램이 거의 단일 시스템 호출만 실행하기 때문에 이는 어렵지 않지만 구현 간에 차이가 있으며 일부는 정수 값으로 제한되지 않고 일부는 m분 등과 같은 지정자가 필요합니다.

df그리고 ps일반적으로 외부 프로세스도 있습니다. df너무 빨리 실행되어 포착할 수 없을 수도 있지만(내 시스템에서는 실행하는 데 0.003초가 걸리는 것으로 표시됨) time df출력에는 거의 확실하게 프로세스 자체도 포함되어 있습니다.pspsps -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이 세션에서는 사용되지 않았으므로 명령은 해당 경로만 표시합니다.

관련 정보