background
이러한 프로세스 개념은 , zombie
및 daemon
와 어떻게 관련됩니까 without controlling terminal
?
나는 그들이 어떤 면에서, 특히 통과의 개념에 가깝다고 생각 controlling terminal
하지만, 아직 이해하지 못한 채 Linux에 관한 기사를 읽는 아이에게 뭔가를 설명해야 하는 것처럼 이야기할 정보가 많지 않습니다. 너무 많은 거짓말처럼.
업데이트 #1: 예를 들어(사실인지는 모르겠습니다)
background
-- - 상위 프로세스가 없는 백그라운드 프로세스이므로 포zombie
그라운드 프로세스는 될 수 없습니다.zombie
zombie
daemon
---without ctty
모든 프로세스는daemons
없이 실행되지만ctty
모든 프로세스가ctty
없으면 실행되지는 않습니다.daemons
background
--daemon
-a를background process
검색하여 대화식으로 다시 실행할 수 있습니다.daemon is not
zombie
--without ctty
- 부착 여부는zombie
중요 하지 않습니다.ctty
background
--- 때때로 백그라운드로 전송되어 데몬이 되거나 데몬에서 가져오면 죽는without ctty
경우processes
ctty
ctty
답변1
즉, 링크를 추가하십시오.
좀비
종료/종료되었지만 부모가 아직 종료를 확인하지 않은 프로세스(시스템 wait()
호출 사용) 죽은 프로세스는 프로세스 테이블에 저장되어 상위 프로세스에 하위 프로세스의 하위 프로세스 종료 및 종료 상태를 알릴 수 있습니다. 일반적으로 하위 프로세스를 분기하는 프로그램은 종료 시 종료 상태도 읽으므로 상위 프로세스가 중지되거나 문제가 있는 경우에만 좀비를 볼 수 있습니다.
바라보다:
제어 터미널, 세션, 포그라운드, 백그라운드
이는 터미널에서 실행되는 셸 컨텍스트의 작업 제어와 관련이 있습니다. 사용자는 로그인하고, 세션을 시작하고, 터미널(제어 터미널)에 바인딩하고 쉘을 시작합니다. 그런 다음 쉘은 프로세스를 실행하고 사용자의 희망에 따라 이를 전경과 배경으로 보냅니다( 를 사용하여 프로세스 시작, 및 을 사용하여 &
프로세스 중지 ). 터미널에서 읽거나 쓰는 경우 터미널에 인터럽트 신호가 있으면 백그라운드 프로세스가 중지됩니다. 포그라운드 프로세스는 인터럽트 신호를 받습니다. (커널의 터미널 드라이버는 이러한 신호를 처리하고 쉘은 어떤 프로세스(그룹)가 포그라운드 또는 백그라운드로 전송되는지 제어합니다.^Z
fg
bg
^C
바라보다:
악마
데몬으로 실행되는 프로세스는 일반적으로 특정 터미널(또는 로그인 세션 또는 셸)에 바인딩되어서는 안 됩니다. 터미널이 닫혀 있으면 신호를 수신하지 않도록 제어 터미널이 없어야 하며 일반적으로 터미널에서 I/O를 수행하지 않을 것으로 예상됩니다. 명령줄에서 데몬을 시작하려면 터미널과의 모든 연결을 끊어야 합니다. 즉, 제어 터미널을 제거하기 위해 새 세션(위의 작업 제어 의미에서)을 시작하고 터미널의 파일 핸들을 닫아야 합니다. 물론 init
systemd 또는 이와 유사한 로그인 세션 외부에서 시작된 작업에는 처음부터 이러한 연결이 없습니다.
데몬에는 제어 터미널이 없기 때문에 작업 제어 대상이 아니며 작업 제어 의미에서 "포그라운드" 또는 "백그라운드"에 있는 것도 적용되지 않습니다. 또한 데몬은 init
종료 시 정리 되도록 부모가 다시 지정되는 경우가 많으 므로 일반적으로 데몬을 좀비로 취급하지 않습니다.
바라보다:
답변2
좀비다른 프로세스와 실제 관계가 없습니다. 종료되었지만 종료 상태 waitpid()
또는 이와 유사한 프로세스가 아직 상위 프로세스에서 읽혀지지 않은 프로세스일 뿐입니다. 프로세스에 오류가 있거나 중지되지 않는 한 이러한 내용이 표시되지 않아야 합니다.
ㅏ악마터미널을 제어하지 않고도 실행할 수 있는 프로그램입니다. 일반적으로 프로그램을 실행하면 fork()s
자체 프로세스와 상위 프로세스가 모두 종료되므로 쉘은 명령이 완료되었다고 생각하고 하위 프로세스는 터미널에서 분리되어 로그인 세션을 종료합니다. 상위 프로세스가 종료되면 해당 상위 프로세스 ID는 1이 됩니다(전통적으로는 program init
이거나 현재는 ) systemd
. 이 프로세스는 하위 항목이 죽은 후에 수집되므로 좀비에 압도당하지 않습니다.
프로세스는 프로세스와 연관될 수 있습니다.제어 터미널, 일반적으로 입력을 받고 출력을 보내는 곳입니다. 터미널은 연결된 프로세스에 신호를 보내고 프로세스 그룹을 다음과 같이 식별할 수도 있습니다.전경 그룹. 프로세스는 다음 위치에 있습니다.전경 그룹Ctrl-C 및 Ctrl-Z를 누를 때 터미널에서 입력을 읽고 SIGINT 및 SIGSUSP 신호를 보낼 수 있습니다. 포함되지 않은 모든 프로세스전경 그룹SIGTSTP에 의해 터미널에서 데이터를 읽으려는 시도가 일시중단되었습니다.
쉘은 실행을 요청한 각 파이프 명령에 대해 서로 다른 프로세스 그룹을 생성하고 어느 프로세스 그룹을 전환할지를 전환합니다.전경 그룹포그라운드와 백그라운드 사이에서 작업을 이동합니다. 명령을 실행하면 일반적으로 쉘은 새 프로세스 그룹을 생성하고 그룹을 만듭니다.전경 그룹. 접미사를 추가하면 &
쉘은 단순히 그대로 유지됩니다.전경 그룹그것이 어디에 있는지, 그래서 새로운 그룹이 배경에 있습니다. Ctrl-Z를 누르면 SIGSUSP가 전경 그룹으로 전송되어 대부분의 명령이 정지되지만 쉘은 정지되지 않지만 활성 명령이 변경됩니다.전경 그룹새로운 명령을 요구할 수 있도록 자신을 반환합니다.
이 bg
명령은 SIGSUSP로 일시 중지된 후 백그라운드에서 실행을 재개할 수 있도록 SIGCONT를 프로세스 그룹에 보냅니다. fg
변경됨전경 그룹이미 백그라운드에서 실행 중인 기존 그룹 중 하나로 이동하여 이를 포그라운드로 가져옵니다.
답변3
좋아요, 제 설명은 이렇습니다. 요점은차이점이러한 유형의 프로세스 사이(간단하지만 유익함):
zombie
- 방금 종료되었지만(실행이 완료됨) 프로세스 테이블에 여전히 항목이 있는 프로세스입니다.노트:좀비프로세스에는 여전히부모일반적으로 존재 이유는 상위 프로세스에 하위 프로세스의 실행 결과(종료 코드 등)를 알리는 것입니다.disowned process
disown
(터미널을 제어하지 않음) - 사용자가 명시적으로 편집하거나 상위 프로세스 트리에서 분리되도록 설계된 프로세스입니다. 상위 프로세스가 실행을 완료하더라도 계속 실행됩니다. 예를 들어, 사용자가ssh
원격 컴퓨터에 로그인하여 웹 서버와 같은 것을 시작한 다음disown
해당 컴퓨터에서 실행하고ssh
세션을 종료합니다. 프로세스는 더 이상 상위 프로세스 트리의 일부가 아니기 때문에 계속 실행됩니다. 프로세스 실행을 거부할 수도 있습니다nohup
.background process
- 백그라운드에서 실행됩니다. - 출력을 사용자의 tty로 분할하지 않습니다. 결국 실행하거나&
의도적으로 백그라운드로 포크됩니다. 프로세스를 백그라운드로 보내는 다른 옵션은 프로세스를 실행하고 키를 누르는 것입니다ctrl+z
. 그러나 상위 프로세스가 종료되면 백그라운드에서 실행 중인 하위 프로세스도 종료됩니다(노트작성자: @psusi - 이전 사실은 사용자가 터미널에서 시작한 프로세스에만 적용됩니다. 그렇지 않으면 하위 프로세스가 "고아"가 되어 init 프로세스(pid 1)를 상위 프로세스로 가져옵니다.daemon
- 백그라운드 프로세스와 매우 유사합니다. 또한 백그라운드에서 실행되지만 (설계상) 암시적으로 분기될 가능성이 높습니다. 일반적으로 실제 작업(들어오는 연결 등)을 수행하기 전에 어떤 일이 발생하기를 기다리면서 백그라운드에서 조용히 앉아 있습니다. 실제로,악마둘 다 가능인식되지 않음(가능성이 더 높음) 그리고배경프로세스는 디자인에 따라 다릅니다.
이 설명이 이러한 유형의 프로세스를 구별하는 데 도움이 되기를 바랍니다.