터미널에서 &로 뭔가를 백그라운드에 올려두고 잊어버린 적이 있습니다. ps aux | grep ...로 찾으려 하면 시스템 전체 프로세스가 쏟아집니다. 현재 세션에서 내가 올린 것만 보고 싶을 때 쓰는 게 jobs입니다.
jobs는 현재 셸 세션의 백그라운드 작업 목록을 보여줍니다. Windows 작업 표시줄처럼 "이 세션에서 내가 실행한 것 중 지금 백그라운드에 있는 것"만 보여줍니다. 시스템 전체가 아닙니다.
UNIX에서 Job은 Process의 집합입니다. Job의 ID는 Process Group ID를 의미합니다.
macOS Sonoma, zsh에서 테스트했습니다. zsh는 확장 기능이 있으며 man zshbuiltins에서 자세한 내용을 확인할 수 있습니다.
기본 사용
백그라운드 작업을 하나 만들어봅니다.
sleep 100 &
&는 명령어를 현재 세션의 백그라운드로 보냅니다. 셸은 바로 다음 입력을 받을 수 있습니다.
jobs를 실행하면 이렇게 나옵니다.
jobs
[1] + 12345 Running sleep 100 &
각 필드의 의미입니다.
| 필드 | 값 | 의미 |
|---|---|---|
[1] |
작업 번호 | fg %1, kill %1 등에서 사용 |
+ |
현재 기본 작업 | fg, bg 기본 대상 |
12345 |
Process Group ID | -l 옵션에서 표시됨 |
Running |
상태 | 아래 참조 |
sleep 100 & |
명령어 | 실행한 명령 그대로 |
+는 다음 fg/bg 호출의 기본 대상, -는 + 작업이 종료되면 기본이 될 다음 후보입니다.
상태값
jobs 출력에서 볼 수 있는 상태입니다.
| 상태 | 의미 |
|---|---|
Running |
실행 중 |
Done |
정상 종료 (exit 0) |
Done(code) |
비정상 종료 (exit code) |
Stopped |
SIGTSTP로 중단 (Ctrl+Z) |
Stopped (SIGSTOP) |
SIGSTOP으로 중단 |
Stopped (SIGTTIN) |
백그라운드에서 터미널 입력 대기 |
Stopped (SIGTTOU) |
백그라운드에서 터미널 출력 대기 |
옵션
jobs [-l | -p] [job_id...]
-l: Process Group ID 포함해서 출력-p: Process Group ID만 출력 (스크립트에서 PID 추출할 때 유용)
job_id를 지정하면 해당 작업만 표시합니다. 생략하면 전체를 보여줍니다.
zsh 버그
zsh 5.9 (x86_64-apple-darwin23.0)에서 jobs -p가 PID만 출력해야 하는데 -l과 동일하게 전체 정보를 출력하는 버그가 있습니다. bash에서는 -p가 정상 동작합니다. PID만 필요하다면 bash를 사용하거나 jobs -l | awk '{print $3}'로 파싱하는 게 현실적입니다.