PHP 백그라운드 및 비동기 데몬 실행


데이터 분석 수집 스크립트, 대량 이메일 발송, API 메시지 큐 리스너 등 무거운 연산을 처리하는 PHP 스크립트는 실행 시간이 수 시간 혹은 무기한으로 길어질 수 있습니다. 이러한 긴 작업을 터미널 창을 켠 채로 기다리거나 터미널 접속을 끊었을 때 강제 종료되도록 방치할 수는 없습니다.

이 장에서는 스크립트를 리눅스 운영체제 백서에 등록하여 백그라운드 프로세스(Background Process)로 가동하고 프로세스를 제어하는 법을 알아봅니다.


1. 백그라운드 & nohup 구동 아키텍처


아래 다이어그램은 리눅스 환경에서 백그라운드로 실행 위임된 PHP 프로세스가 어떻게 터미널 세션(SIGHUP 신호)으로부터 독립하여 동작을 유지하고, 명령어 인자에 따라 표준 입출력 스트림을 한데 묶어 로그 파일로 리다이렉트 처리하는지 보여줍니다.

PHP 백그라운드 구동 아키텍처


2. 단순 백그라운드 가동 (&)


명령어 맨 뒤에 앰퍼샌드 기호인 &를 붙여 실행하면, 터미널의 입력 주도권을 사용자에게 즉시 반환하며 프로세스를 뒷단으로 보냅니다.

$ php heavy-task.php &
[1] 43810
  • 터미널에 대괄호로 표시된 수치 [1]은 백그라운드 작업 번호(Job ID)이며, 43810은 운영체제가 할당한 고유한 프로세스 ID(PID)입니다.
  • 치명적 한계: 이 방식으로 구동하면 사용자가 터미널 SSH 접속 세션을 종료하거나 로그아웃하는 순간, 리눅스는 부모 프로세스가 종료된 것으로 판단하여 자식인 PHP 프로세스에도 SIGHUP (Hangup - 연결 끊김 시그널)을 전송해 강제로 죽여 버립니다.


3. 세션 종료 후에도 상시 가동 유지 (nohup 연동)


터미널을 닫아 세션 연결이 중단되어도 프로세스가 SIGHUP 시그널을 무시(No Hang Up)하도록 하여, 백그라운드에서 동작 완료 시점까지 무중단 구동하게 만드는 표준 명령어는 nohup입니다.

# 1. nohup 기본 구동 (로그 출력을 자동으로 nohup.out에 수집)
nohup php heavy-task.php &

# 2. 실무 추천: 사용자 정의 로그 파일 지정 및 표준 에러까지 일괄 리다이렉션
nohup php heavy-task.php > my_task.log 2>&1 &

# 3. 디스크 용량 관리를 위해 모든 출력 및 에러 메시지 버리기 (로그 생략)
nohup php heavy-task.php > /dev/null 2>&1 &

> /dev/null 2>&1: > /dev/null은 표준 출력을 리눅스의 가상 휴지통 디바이스로 버린다는 의미이며, 2>&1은 표준 에러(2) 출력 역시 표준 출력(1)이 향하는 경로(휴지통)와 동일하게 처리하여 일체 로그를 기록하지 않는다는 의미입니다.


4. 백그라운드 프로세스 제어 및 종료 기법


백그라운드에서 돌아가고 있는 PHP 프로세스를 확인하고 통제하려면 다음 리눅스 명령어들을 조합해 사용합니다.

1) 프로세스 추적 및 조회 (ps)

현재 시스템 메모리에 적재되어 도는 모든 프로세스 중 ‘php’가 포함된 라인만 필터링합니다.

$ ps aux | grep php
root     43810  1.2  0.8 123456 32420 pts/0    S    10:15   0:05 php heavy-task.php
root     43912  0.0  0.0  12100   980 pts/0    S+   10:17   0:00 grep --color=auto php

두 번째 컬럼의 43810이 해당 프로세스의 PID 정보입니다.

2) 프로세스 종료 (kill)

동작 중인 백그라운드 루프 프로세스를 중단하고 싶을 때는 kill 명령을 사용합니다.

# 안전하게 프로그램 종료 요청 (권장)
kill 43810

# 프로세스가 먹통이 되어 안전 종료에 응답하지 않을 때 강제 소멸 시그널 전송 (비상용)
kill -9 43810


5. 고도화: 프로세스 감시 도구 (Supervisor) 권장


단순히 nohup &로 띄워둔 백그라운드 프로세스는 예기치 못한 PHP 코드 오류나 DB 커넥션 끊김 등으로 중간에 멈출 경우 자동으로 되살아나지 못합니다.

실제 상용 서비스 배치 연산(예: Laravel 큐 리스너)을 가동할 때는 리눅스 프로세스 감시 관리자인 Supervisor 패키지를 설치해 구성하는 것이 모던 인프라의 정석입니다.

  • 역할: PHP 스크립트 프로세스가 죽을 경우 백그라운드에서 자동 재가동(Autostart, Autorestart)시키고, 여러 개의 프로세스 복제본(Process Count)을 한꺼번에 띄워 병렬 처리하는 작업을 대시보드로 자동화해 줍니다.
서브목차