리눅스

세션관리 nohup

현박이 2025. 1. 23. 18:16
반응형

웹에서 사용자가 요청시 특정 프로세스를 백그라운드에서 돌려야하는 상황이 있다.

해결해야 되는건 2가지가 있었다.

첫번째로 사용자가 누르고 백그라운드에서 도는 동안 사용자는 페이지에서 다른 작업을 할 수 있어야한다.

두번째로 프로세스 실행시간이 길어 세션이 끊어지는 상황에서도 백그라운드에서 실행된 작업은 끊기지 않아야한다.

이 두 가지의 문제점으로 인해 처음 작업했던 코드이다.

php 의 코드이그나이터3를 사용했다.

// 사용자가 호출하는 함수
function test_start(){
    $cmd = "php -f /www/index.php /phs/test_ing > /data/tmp/test_back.txt 2>&1 &"; 

    exec($cmd,  $output, $return_var);
    print_r($cmd);
    print_r($output);
    print_r($return_var);
    exit;
}

// 실제 백그라운드에서 돌아가는 함수
function test_ing(){

    sleep("15");
    $output_file = "/data/tmp/TEST111.txt";
    $output_handle = fopen($output_file, 'w');
    fwrite($output_handle, "TEST");
    @fclose($output_handle);

    exit;
}

 

ajax를 사용하여 test_start 를 호출하게 되면 &를 사용하여 명령을 백그라운드에서 실행하므로, test_start 함수는 즉시 종료되며, PHP CLI는 별도의 프로세스로 실행된다.

따라서 test_ing 함수가 실행되는 동안 웹 요청은 종료되고, 사용자에게 바로 리턴을 줄 수 있다.

여기서 체크해야될 부분이 하나 있는데 hook 을 사용한다면 test_ing 는 예외처리를 해줘야한다.

 

그리고 똑같은 기능을 하는 다른 방법도 있다고한다

 

리눅스의 nohup 명령어

이 명령어는 방금 내가 처리한 2가지의 함수를 거치는 방법과 동일하게 작동한다.

세션과의 연결이 종료되더라도 nohup 으로 돌린 프로세스는 데몬 형태로 실행되게 되어 종료되지 않고 계속 실행된다.

 

nohup php -f /www/index.php /phs/test_ing > /data/tmp/test_back.txt 2>&1 &

 

리눅스에서 실행하게 되는 경우 위의 명령어를 사용하면 될 것이다.

반응형

'리눅스' 카테고리의 다른 글

sh 활용 파일 비교  (0) 2025.06.02
리눅스 DB 백업 및 복원  (2) 2025.04.09