작업 제어
멀티 태스킹은 Unix 시스템 최고의 장점 중 하나이다. Unix는 포그라운드와 백그라운드로 프로그램을 구별한다. 이 기능 덕분에 터미널에서 동시에 여러 개의 프로그램을 실행시킬 수 있다.
포그라운드와 백그라운드
포그라운드에서는 한번에 오직 한개의 프로그램만 실행할 수 있는 반면, 백그라운드에서는 여러 프로그램을 동시에 실행시킬 수 있다.
프로그램을 백그라운드에서 실행시키려면 명령행 끝에 앰퍼샌드(&)를 붙이면 된다.
$ gcc test.c &
[1] 2573
위 명령어를 사용하면 test.c라는 파일을 백그라운드에서 컴파일하고, 컴파일이 진행되는 동안 다른 일을 할 수 있다. 쉘은 작업 번호를 대괄호([])안에 출력하고 프로세스 식별 번호(PID)를 이어서 출력함으로서 백그라운드 작업이 시작되었음을 알린다.
jobs명령어는 현재 백그라운드로 실행되고 있는 프로그램들의 리스트를 출력한다.
$ gcc test.c &
[1] 2574
$ jobs
[1] + Running gcc test.c
백그라운드 프로그램을 포그라운드로 가져오려면 fg명령어를 이용한다. 백그라운드에 여러개의 작업이 있다면 fg명령어 뒤에 작업 식별자(% 와 작업번호)를 이용한다.
$ jobs
[1] - Running gcc test.c
[2] + Stopped vi test.c
$ fg %1
작업 목록에 있는 덧셈기호는 그 작업이 기본적으로 포그라운드로 올라오게 될 것이라는 것을 의미한다.
포그라운드에서 실행중인 작업을 중지시키려면 CTRL+z를 누른다. CTRL+z는 CTRL+c같은 인터럽트 문자가 적용되지 않는 프로그램을 중단시키고자 할 때도 이용할 수 있다.
백그라운드 명령어안 bg는 중단된 프로그램을 백그라운드에서 다시 실행시키는 데 이용된다. 포그라운ㄷ 명령어 fg는 이 프로그램을 다시 포그라운드에서 실행하도록 한다.
$ gcc test.c
CTRL+z
Stopped
% bg
[1] +Running gcc test.c
백그라운드 작업은 kill명령어를 이용해 끝낼 수 있다.
$ kill %1
작업번호 뿐만 아니라 작업명을 이용해 작업을 선택할 수 있다.
$ kill %gcc
작업 제어 요약
명령어 | 의미 |
---|---|
command & | 백그라운드에서 command를 실행. 계속해서 포그라운드에서 다른 작업들을 실행할 수 있음 |
CTRL+c | INTR 시그널을 보내서 포그라운드 작업을 죽임 |
CTRL+z | TSTP 시그널을 보내서 포그라운드 작업을 중지시킴 |
suspend | 쉘을 중지시킴 |
stop | 명령어 또는 같은 기능의 앨리어스를 이용해 백그라운드 작업을 중지시킴 |
bg %num | 중지된 작업을 백그라운드에서 계속 실행되도록 함 |
fg %num | 백그라운드 작업이나 중지된 작업을 포그라운드로 가져옴 |
kill &num | 특정 백그라운드 작업을 중지시킴 |
kill pid | 프로세스 ID를 이용해 특정 백그라운드 작업을 종료시킴 |
jobs | 백그라운드 작업과 중지된 작업을 작업 번호와 함께 나열함 |
set notify | 작업의 상태가 바뀌면 즉시 통보함 |
stty tostop | 백그라운드 작업들이 화면에 메세지를 출력하지 못하도록 함 |