sudo su는 자식 터미널을 생성합니까?


9

이것은 내가이 실행될 때 무슨 일이 있었는지입니다 sudo su다음exit

$ sudo su
# exit
exit
$ 

exit 명령은 터미널 에뮬레이터를 닫지 않습니다.

아동용 단말기입니까?

답변:


16

당신이 실행 sudo su하거나 새로운 쉘이 생성 되면 .su user

exit(또는 Ctrl+ D)를 실행 하면 새로 작성된 쉘이 종료되고 이전 쉘로 돌아갑니다.

  1. 시작점-bash 쉘이 PID 25050에서 실행 중입니다.

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25200 pts/17   00:00:00 ps
  2. 실행 sudo su하면 PID 25203에서 실행중인 새 bash 프로세스가 작성됩니다.

    $ sudo su
    # ps
      PID TTY          TIME CMD
    25201 pts/17   00:00:00 sudo
    25202 pts/17   00:00:00 su
    25203 pts/17   00:00:00 bash
    25213 pts/17   00:00:00 ps
    # exit
  3. 종료 sudo su및 시작점으로 돌아 가기-bash 쉘이 PID 25050에서 실행 중입니다.

    $ ps
      PID TTY          TIME CMD
    25050 pts/17   00:00:00 bash
    25214 pts/17   00:00:00 ps
    $

그래서 그것은 자식 껍질로 취급 될 수 있습니까?
Reeshabh Ranjan

1
@ReeshabhRanjan-예
Yaron

17

같은 터미널, 다른 쉘.

하위 쉘을 포함하여 쉘에서 실행하는 하위 프로세스는 동일한 터미널을 자동으로 사용합니다. 이것은 sudo어떤 식 으로든 특정 적이 지 않으며, 일반적으로 쉘에서 프로그램을 실행할 때 작동하는 방식입니다.

쉘과 터미널은 다릅니다. 쉘은 당신이에서 명령을 실행하는 데 사용하는 것입니다 터미널 . 쉘은 대화식으로 작동 할 수 있습니다. 프롬프트를 표시하고 명령을 내리거나 명령을 실행하거나 실패 할 수없는 이유에 대한 오류를 표시하며 쉘을 종료 할 때까지 프로세스가 반복됩니다. 또는 스크립트를 실행 하여 비 대화식으로 작동 할 수 있습니다 .

터미널이 (아마도!)하더라도 에뮬레이트 하지 물리적 , 그럼에도 불구하고 유닉스 계열 우분투 할당과 같은 운영 체제 장치 노드 하여 각 단자에, 당신은 당신이 함께 사용하는 터미널을 확인할 수 있습니다 tty명령. 그것은 일반적으로 될 것입니다 /dev/pts/0, /dev/pts/1, /dev/pts/2, A에 대한, 터미널 창 또는 SSH 연결 , 또는 /dev/tty1, /dev/tty2, 을 위해, 가상 콘솔 . 실제로 어떤 tty터미널에서 입력 이 이루어지고 있는지 알려주 는 것입니다. 자세한 내용은 아래를 참조하십시오.

ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ bash
ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ exit
exit
ek@Io:~$ sudo su
[sudo] password for ek:
root@Io:/home/ek# tty
/dev/pts/1
root@Io:/home/ek# exit
exit
ek@Io:~$

Yaron이 잘 설명sudo su 하는 것처럼 새로운 쉘 생성 하더라도 사용중인 터미널은 변경되지 않음을 알 수 있습니다.

물론 터미널이 동일한 지 관찰하는 또 다른 방법이 있습니다. 입력을 같은 방식으로 같은 장소에 쓰고 동일한 방법으로 같은 장소에서 출력을 읽는 것입니다.

몇 가지 기술적 세부 사항

대부분의 명령은 쉘에서 실행 - 같은 ls, cp, mv, rm, touch, wc, du, df, ssh, su, sudo, sh, bash, 및 많은 더 - 원인 자식 프로세스가 생성 될 수 있습니다. 이 자식 프로세스는 쉘을 부모로 가지고 있지만 별도의 프로그램입니다. 기본적으로 쉘 과 동일한 터미널에 연결됩니다 .

쉘은 여전히 ​​실행 중이지만 백그라운드에서 프로그램이 종료 될 때 까지 대기합니다 (또는 일시 중단 할 때까지 ). 프로그램이 종료되면 쉘은 여전히 ​​실행 중이며 작동을 재개하여 다음 명령을 입력하라는 프롬프트를 표시합니다.

다음은 주요 예외입니다.

자식 프로세스가 부모와 동일한 터미널에 연결되는 경우 예외로 간주하지는 않지만 터미널의 쉘에서 실행하는 프로세스가 항상 터미널에서 입력을 받거나 해당 터미널로 출력을 보내는 것은 아닙니다. :

tty명령은 표준 입력이 어느 터미널인지 확인 하기 때문에 "바보"할 수 있습니다.

ek@Io:~$ tty
/dev/pts/1
ek@Io:~$ tty </dev/pts/0
/dev/pts/0

또는 덜 악의적으로 :

ek@Io:~$ tty </dev/null  # not a terminal
not a tty
ek@Io:~$ tty <&-         # closes the input stream
not a tty
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.