유닉스와 유닉스-계열 운영 시스템에서, 작업 제어는 특히 대화식으로 쉘에 의한 작업의 제어를 참조하여, 여기서 "작업"은 프로세스 그룹에 대한 쉘의 표현입니다. 기본 작업 제어 기능은 작업/프로세스 그룹에서 모든 프로세스를 일시 중단, 재개 또는 종료하는 것입니다; 보다 발전된 기능은 작업에 신호를 보냄으로써 수행될 수 있습니다. 작업 제어는 다중-처리로 인해 유닉스에서 특히 흥미롭고, 일반적으로 순차 실행 (일괄 처리)에 적용되는 작업 제어와 구별되어야 합니다.
Overview
터미널 (또는 터미널 에뮬레이터)을 통해 유닉스 또는 유닉스-계열 운영 시스템을 사용할 때, 사용자는 처음에 로그인 쉘, 오직 단일 프로세스 실행을 가질 것입니다. 대부분의 임무 (디렉토리 나열, 파일 편집 등)는 프로그램이 터미널을 제어하도록 하고 프로그램이 종료될 때 쉘에 제어를 반환함으로써 – 공식적으로 터미널에서 읽거나 쓰는 쉘에 표준 입력과 표준 출력을 붙임으로써, 및 Control+C를 눌러 발생하는 종료 신호와 같이 키보드에서 보내는 신호를 포착함으로써 쉽게 수행될 수 있습니다.
어쨌든, 때때로 사용자는 또 다른 목적으로 터미널을 사용하면서 임무를 수행하기를 원할 것입니다. 실행 중이지만 터미널에서 입력을 받지 않는 임무는 "백그라운드에서" 실행 중이라고 하지만, 터미널에서 입력을 받는 단일 임무는 "포그라운드에서" 실행 중이라고 합니다. 작업 제어는 사용자에게 백그라운드에서 프로세스를 시작하고, 이미 실행 중인 프로세스를 백그라운드로 보내고, 백그라운드 프로세스를 포그라운드로 가져오고, 프로세스를 일시 중단하거나 종료하는 것을 허용함으로써, 이를 가능하게 하기 위해 개발된 기능입니다.
작업의 개념은 단일 쉘 명령의 (쉘) 개념을 명령이 수반할 수 있는 많은 프로세스의 (운영 시스템) 개념에 매핑합니다. 프로세스가 추가적인 자식 프로세스를 생성할 수 있고, 단일 쉘 명령이 여러 통신 프로세스의 파이프라인으로 구성될 수 있기 때문에 다중-프로세스 임무가 발생합니다. 예를 들어, "제목"이라는 텍스트를 포함하는 행을 선택하고, 이것들을 알파벳순으로 정렬하고, 결과를 페이저에 표시하는 명령이 있습니다.
grep title somefile.txt | sort | less
이것은 적어도 3개의 프로세스: grep에 대해 하나, sort에 대해 하나, 및 less에 대해 하나를 생성합니다. 작업 제어는 쉘에게 이들 관련된 프로세스를 하나의 항목으로 제어하는 것을 허용하고, 사용자가 적절한 키 조합 (보통 Control+Z)을 발행하면, 전체 프로세스 그룹이 일시 중단됩니다.
작업은 운영 시스템에 의해 단일 프로세스 그룹으로 관리되고, 작업은 그러한 그룹의 셸의 내부 표현입니다. 이것은 POSIX에서 다음과 같이 정의됩니다:
같은 프로세스 그룹에 있는 쉘 파이프라인과 이 파이프라인에서 파생된 임의의 프로세스로 구성된 일련의 프로세스입니다.
작업은 job control job ID 또는 단순히 job ID라고 불리는 handle에 의해 참조될 수 있으며, 이것은 쉘 내장에 의해 작업을 참조하기 위해 사용합니다. 작업 ID는 % 문자로 시작합니다; %n은 작업 n을 식별하지만, %%는 현재 작업을 식별합니다. 다른 작업 ID는 POSIX에 의해 지정됩니다. 비공식적 사용에서, 그 숫자는 "작업 번호" 또는 "작업 ID"라고 참조될 수 있고, Bash 설명서는 (%-접두된) 작업 ID를 jobspec으로 참조합니다.
작업 제어와 작업 ID는 전형적으로 오직 대화식 사용에서 사용되며, 여기서 그것들은 프로세스 그룹 참조를 단순화합니다; 스크립팅에서, PGID가 대신 사용되는데, 왜냐하면 그것들이 더 정확하고 강력하고, 실제로 작업 제어는 배쉬 스크립트에서는 기본적으로 비활성화됩니다.
History
작업 제어는 처음에 Jim Kulp에 의해 C 쉘에서 구현되었으며, 그 후 오스트리아의 IIASA에서, 4.1BSD 커널의 기능을 사용했습니다. Bell Labs에서 개발된 KornShell은 이것을 채택했었고 나중에 Bourne shell의 SVR4 버전에 통합되었고, 대부분의 최신 유닉스 쉘에 존재합니다.
Commands
POSIX 표준은 백그라운드와 포그라운드에서 일시 중단된 작업을 재개하기 위한 두 가지 명령, 각각 bg와 fg을 지정합니다. 이것들은 Korn 쉘 작업 제어 명령을 모델로 했습니다.
Implementation
전형적으로, 쉘은 작업 테이블에 작업 목록을 유지합니다. 작업은 파이프라인의 모든 구성원과 해당 하위 항목으로 구성되는 프로세스 그룹에 해당한다는 점을 상기하십시오. jobs 명령은 작업 번호 및 작업 상태 (중지 또는 실행 중)와 함께 작업 테이블에 존재하는 백그라운드 작업을 나열합니다. 사용자가 로그아웃할 때 세션이 종료할 때 (쉘을 종료하여, session leader 프로세스가 종료됨), 쉘 프로세스는 모든 작업에 SIGHUP을 보내고, 자체로 종료하기 전에 프로세스 그룹에 대해 끝나기를 기다립니다.
disown 명령은 작업 테이블에서 작업을 제거하기 위해 사용될 수 있으므로, 세션이 종료될 때 자식 프로세스 그룹이 SIGHUP으로 전송되지 않고, 쉘이 그것들에 대해 종료되기를 기다리지 않습니다. 그것들은 따라서 고아 프로세스가 되고, 운영 시스템에 의해 종료될 수 있지만, 이것이 더 자주 사용되므로 프로세스가 init에 의해 채택되고 (커널이 그들의 부모 프로세스를 init로 설정), 데몬으로 계속 실행합니다. 작업이 종료되는 것을 방지하는 대안은 nohup 및 터미널 멀티플렉서 사용을 포함합니다.
포그라운드에서 실행 중인 작업은 일시 중단 문자 (Ctrl-Z)를 입력함으로써 중지될 수 있습니다. 이것은 "터미널 정지" 신호 (SIGTSTP)를 프로세스 그룹으로 보냅니다. 기본적으로, SIGTSTP는 그것을 수신하는 프로세스를 중지하는 원인이 되고, 제어는 쉘에 반환됩니다. 어쨌든, 프로세스는 SIGTSTP에 대한 신호 처리기를 등록하거나 무시할 수 있습니다. 프로세스는 역시 포착되거나 무시될 수 없는 "중지" 신호 (SIGSTOP)로 일시 중지될 수도 있습니다.
포그라운드에서 실행 중인 작업은 중단 문자 (Ctrl-C)를 입력함으로써 방해될 수 있습니다. 이것은 "인터럽트" 신호 (SIGINT)를 전송하며, 이것은 기본적으로 프로세스를 종료하는 것이지만, 그것은 덮어 쓰일 수 있습니다.
중지된 작업은 bg 내장을 사용하여 백그라운드 작업으로, 또는 fg를 사용하여 포그라운드 작업으로 재개될 수 있습니다. 두 경우에서, 셸은 I/O를 적절하게 리다이렉션하고, SIGCONT 신호를 프로세스에 전송하여, 운영 시스템이 실행을 재개하도록 합니다. Bash에서, 프로그램은 명령줄에 앰퍼샌드 (&)를 덧붙임으로써 백그라운드 작업으로 시작될 수 있습니다; 그 출력은 터미널로 향하지만 (잠재적으로 다른 프로그램의 출력과 인터리브됨), 그것은 터미널 입력에서 읽힐 수 없습니다.
제어 터미널에서 읽거나 쓰기를 시도하는 백그라운드 프로세스는 SIGTTIN (입력에 대해) 또는 SIGTTOU (출력에 대해) 신호를 보냅니다. 이들 신호는 기본적으로 프로세스를 중지하지만, 그것들은 다른 방식으로 처리될 수도 있습니다. 쉘은 종종 백그라운드 프로세스가 기본적으로 출력을 제어 터미널에 전달하도록 SIGTTOU의 기본 중지 동작을 덮어씁니다.
Bash-호환 쉘에서, kill 내장 (/bin/kill 아님)은 작업 ID와 프로세스 그룹 ID로 작업에 신호를 보낼 수 있습니다 – 작업에 신호를 보내면 전체 프로세스 그룹에 신호를 보내고 작업 ID로 지정된 작업은 % 접두사로 종료되어야 합니다. kill은 작업에 임의의 신호를 보낼 수 있습니다; 어쨌든, 만약 의도가 프로세스의 시스템을 제거하는 것이면, 신호 SIGKILL와 SIGTERM (기본값)은 아마도 가장 적합할 것입니다.
Further reading
- Marshall Kirk McKusick and George V. Neville-Neil (2004-08-02). "FreeBSD Process Management: Process Groups and Sessions". The Design and Implementation of the FreeBSD Operating System. Addison Wesley. ISBN 0-201-70245-2.
External links
- "Job Control", Bash Reference Manual