프롬프트 막지 않고 뭔가 돌리기
명령 끝에 &를 붙이면 셸은 그 명령을 백그라운드 작업으로 시작하고 프롬프트를 돌려줘. jobs는 현재 셸이 추적하는 작업을 보여 주며, fg와 bg는 그 작업을 전경으로 옮기거나 멈춘 상태에서 다시 실행해.
흐름
./long-build.sh & # 백그라운드 시작
jobs # [N] 태그로 나열
fg %1 # 작업 1을 포그라운드로 전환
Ctrl+Z # suspend
bg %1 # background 재개
fg %1 # 다시 foreground
kill %1 # 종료작업 ID와 PID를 구분해
%1은 현재 셸이 붙인 첫 번째 작업 번호라서 kill %1처럼 사용할 수 있어. 다른 셸에서 ps나 kill을 쓸 때는 jobs -l로 실제 PID를 먼저 확인해.
disown으로 셸의 작업 표에서 빼기
셸과 터미널이 끝날 때 작업이 SIGHUP을 받는지는 셸 옵션과 작업 상태에 따라 달라져. disown은 셸의 작업 표에서 항목을 빼거나 HUP 처리 방식을 바꾸지만, 프로그램의 표준 입출력까지 터미널에서 분리해 주는 만능 해결책은 아니야. 오래 돌릴 작업은 tmux나 서비스 매니저가 더 관찰하기 쉬워.
언제 tmux로 갈아탈까
잠깐 명령을 멈추고 다른 작업을 할 때는 작업 control이 가벼워. 연결이 끊긴 뒤 다시 화면과 로그를 이어 봐야 하는 작업이라면 tmux 세션을 쓰고, 재부팅 뒤에도 자동으로 살아야 하는 서비스라면 운영체제 서비스 매니저에 맡겨.
작업 번호는 현재 셸 안에서만 통해
%1은 시스템 전체의 안정된 식별자가 아니라 지금 이 셸이 붙인 번호야. 다른 터미널에서는 같은 프로세스를 다른 번호로 보거나 전혀 작업으로 알지 못해. 셸 경계를 넘으면 PID와 명령줄을 다시 확인하고, 장기 운영에는 서비스 이름을 써.
백그라운드는 무인 운영과 달라
&는 프롬프트를 돌려줄 뿐 로그 회전, 재시작, 자원 제한, 실패 알림을 제공하지 않아. 사람 눈앞에서 잠깐 병렬로 돌리는 데는 충분하지만, 잊어도 되는 작업으로 만들려면 그 생명주기를 누가 소유하는지 따로 정해야 해.