마스터욱 0 422 0 0

이번 프로젝트에서는 초단위로 시세 API 를 호출해서 DB에 시세 데이터를 넣어야 하는 일이 생겼습니다.

뭐 생각나는것이라곤 크론탭(Crontab) 밖에 없었습니다.

하지만 크론탭은 최소 분단위까지만 허용이 됩니다.

그래서 결국 데몬 프로그램을 만들수 밖에 없었습니다.

 

데몬 프로그램 소스코드는 대략 아래와 같습니다.

_cron_start.php

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
while(TRUE)
{
    $sql = "SELECT value FROM cb_config WHERE name = 'cron_start'";
    $result = mysql_query($sql);
    $cron_start = mysql_fetch_assoc($result);
    $cron_start = $cron_start['value'];
 
    if($cron_start == "ok")
    {
        include "_cron.php";
        sleep(20);
    }
    else
    {
        break;
    }
}
cs

 

데몬은 php 로 작성하였으며, DB에 특정값이 "ok" 가 떨어질 동안 20초 간격으로 계속 _cron.php 파일을 실행합니다.

_cron.php 파일안에 초단위 시세 API 를 수집하는 프로그램이 작동중입니다.

여기까지 제작을 하고, 욕심이 더 생겼습니다.

관리자 페이지에서 이 데몬을 ON/OFF 를 제어하고 싶었습니다.

 

그래서 웹 관리자 페이지에 특정 버튼을 누르면 아래와 같이 exec 로 위 데몬을 작동하게끔 하였습니다.

 

exec('crontab _cron_start.php'); 

 

뭐 작동은 잘됩니다.

버튼 하나로 제가 만든 데몬이 실행되는 것이지요.

다만 문제가 발생했습니다.

데몬 소스가 조건절에 의한 무한루프 소스다보니, 관리자페이지에서 데몬을 실행하면, 관리자 페이지가 뻗어버리는 증상이 발생했습니다.

데몬이 돌아가는 메모리를 고스란히 웹관리자가 먹는것 같았습니다.

 

그래서 고민한 끝에 한가지 꼼수를 생각해냈습니다.

크론탭으로 데몬을 실행하고, 크론탭을 바로 지워버리면? 데몬을 실행하는건 크론탭이기 때문에 웹관리자가 영향을 안 받지 않을까?

 

결과는 성공적이었습니다.

 

크론탭 실행은 아래와 같습니다.

_cron_script.php 파일

* * * * * php /home/proejct/_cron_start.php 

 

1분에 1번 데몬을 실행하는 크론탭 명령을 _cron_script.php 파일에 넣어뒀습니다.

그리고 exec 를 다시 수정했습니다.

 

exec('crontab _cron_script.php'); 

 

정상적으로 웹관리자는 뻗지않고, _cron_start.php 다 실행이 됨이 확인되었습니다.(DB에 데이터가 잘 들어감이 확인)

자 이제 마지막으로 crontab 을 제거해 줘야 합니다.

_cron_start.php 파일

exec("crontab -r"); 

 

위와같이 크론을 바로 제거해 줌으로써, 데몬소스가 한번만 실행되고 종료가 되게 하였습니다.

실행된 데몬 소스는 한번만 실행되었지만, while 안에서 조건문에 걸리지 않는 이상 20초마다 수집프로그램을 가동시킵니다.

 

하루동안 삽질해서 얻은 결과였습니다.

 

순서 정리합니다.

1. 웹관리자에서 크론실행버튼 클릭

2. exec('crontab _cron_script.php'); 으로 _cron_script.php 크론이 실행됨. 크론명령어(* * * * * php /home/proejct/_cron_start.php)

3. 데몬파일이 실행됨. - _cron_start.php

4. 데몬파일안에서 크론명령을 지움. - exec("crontab -r");

5. 데몬이 설정된 초단위만큼 주기적으로 데이터 수집을 함.

 

개발은 꼼수다.

 

 

 

 

 

Comments


제목 글쓴이
NSIS 오픈소스 설치프로그램 제작툴 마스터욱
셀레니움(Selenium) 으로 웹크롤러 만들기 마스터욱
외부에서 localhost 접속하기 마스터욱
리눅스(centos) 의 php 에서 mysql 연결시 minor version mismatch 문제 마스터욱
리눅스(Centos) 에서 httpd.conf 세팅 마스터욱
아마존(aws) ec2 서버에 에디트플러스(Editplus) 로 접근하는 방법 마스터욱
윈도우(windows) cmd(명령 프롬프트)에서 한글이 깨질경우 마스터욱
Angular JS, Vue.js, React.JS 류의 자바스크립트 렌더링 크롤링 : Selenium 마스터욱
아이폰에서의 카메라로 바로 이미지 업로드시 발생되는 현상 마스터욱
FileZillra Server 구축시 발생하는 425 Can't open data connection for transfer of "/" 문제 마스터욱
Warning: mysqli_connect(): (HY000/2002): Permission denied 마스터욱
카페24에서 mysql slow-query 확인하는 방법 마스터욱
모든 브라우저에서 지원하는 동영상 재생 마스터욱
주소정보를 GPS 좌표값으로 변경하는 구글 지오코딩키 발급방법 마스터욱
GIT 설정 .gitignore 의 설정이 정상적으로 작동되지 않을때 마스터욱
환율 API 마스터욱
리눅스 Crontab(크론탭) 초단위로 실행하기 위한 꼼수 공개 마스터욱
.gitignore 사용방법 관리자
텔레그램 채팅아이디(Chat ID) 알아내는 쉬운방법 관리자
php 정규식, 날짜+시간형식 체크 - 이동된 게시글입니다. 관리자
카테고리