쉘실행 PHP 프로그램안에서 백그라운드로 외부프로그램 실행 > PHP
PHP

쉘실행 PHP 프로그램안에서 백그라운드로 외부프로그램 실행

조회 163회 댓글 0건
  • 현재 페이지 주소 복사
  • 페이스북으로 공유
  • X 로  공유
  • 트위터로  공유
  • 네이버 블로그로 공유
  • 네이버 카페 공유하기
  • 네이버 라인 공유하기
  • 네이버 밴드 공유하기
  • 링크드인으로 공유하기
  • 핀터레스트에 공유하기

장시간 실행 시키는 프로그램이 있는데 죽네요.

그냥 죽기나 하면 자원 소모가 없을것인데 .... 애가 멈춘현상이 있어 프로세스를 강제로 종료해야 되는 상황인데 

API 호출 하면서 거기서 문제가 있는듯 합니다.



 

내부 구조는 난 모르겠고 다시 받으면 되기 때문에 무한 루프 돌면서 파일 갱신 시간이 1분 넘었으면 무조건 kill 처리하고 다시 실행 시키는 프로그램 입니다.

이때 사용하는 것인데 대략 다음과 같습니다.

이건 당연히 웹서버가 아니라 리눅스 쉘에서 높은 권한으로 실행시키는 프로그램 입니다. 

혹시 PHP라고 하니 웹브라우저를 통해 웹서버에서 실행한다고 생각 하시는 분은 없겠죠?


시스템에 따라 다를 수 있지 않을까 싶은데 제 경우에는 캐쉬 때문에 아래 명령을 추가 했습니다.

분명히 파일이 갱신되었는데 안된것 처럼 인식 한다면 filemtime 위에 넣어주면 됩니다.

clearstatcache(true, $wrtInfoFile);



    while(true)
    {
        if ( date('H') > $endHour ) {
            echo date('Y-m-d H:i:s ') . "{$endHour}시 이후 종료" . PHP_EOL;
            break;
        }

        # 파일을 체크해서 1분 이상 되었으면 pid 파일 열어서 프로세스 종료하고 다시 실행 시킨다
        $filemtime = filemtime($wrtInfoFile);
        if ( $filemtime <time() -60 ) {
            $pid        = file_get_contents($pidFile);
            $cmd        = "kill -9 $pid";
            $result     = exec($cmd);
            echo date('Y-m-d H:i:s ') . "$result" . PHP_EOL;
            echo date('Y-m-d H:i:s ') . "$cmd" . PHP_EOL;

        # 아래를 백그라운드로 실행
        $phpBin     = "/usr/local/bin/php74";
        $scriptPath = "/실행시키고_싶은프로그램.php";
        $param      = "조회1";
        $logFile    = "/log/실행.log";

        $cmd        = sprintf(
            "nohup %s %s %s > %s 2>&1 &",
            escapeshellarg($phpBin),
            escapeshellarg($scriptPath),
            escapeshellarg($param),
            escapeshellarg($logFile)
        );
        $result = exec($cmd);
        echo date('Y-m-d H:i:s ') . "$result" . PHP_EOL;
      echo date('Y-m-d H:i:s ') . "$cmd" . PHP_EOL;

        }
        else {
            // echo date('Y-m-d H:i:s ') . "파일이 1분 이상 되지 않았습니다." . PHP_EOL;
        }



        sleep(5);
    }
 


좀더 우하하게? 외부 실행 시키는 방법이 있기는 하지만 사용을 안해본거라서 이렇게 처리 합니다.



  • 현재 페이지 주소 복사
  • 페이스북으로 공유
  • X 로  공유
  • 트위터로  공유
  • 네이버 블로그로 공유
  • 네이버 카페 공유하기
  • 네이버 라인 공유하기
  • 네이버 밴드 공유하기
  • 링크드인으로 공유하기
  • 핀터레스트에 공유하기
전체 235건 1 페이지
  • profile_image MyISAM은 SELECT가 빠르고 InnoDB는 느리다그런 경우도 있고 아닌 경우도 있기 때문에 어떤 용도로 사용하느냐에 따라서 다를 수 있습니다.그리고 처음 데이터 넣은 다음 select만 90% 이상이고 테이블 사용이 업데이트나 인서트는 적은 경우인지 불특정 다수에게 서비스 하기 때문에 불특정한 row를 가져와서 보여줘야 하는것인지에 다를 수 있는 것입니다. 가장 큰 차이: 데이터와 인덱스 구조→ MyISAM  - 데이터 파일(.MYD) 과 인덱스 파일(.MYI) 이 분리됨  - 인덱스 → 데이터 파일을 다시 읽는 구조  - 동작흐름: PK 인덱스 탐색 (.MYI) -> 데이터 위치…
  • profile_image 데이터베이스를 사용하다 보면 이미 존재하는 데이터인지 확인한 후 INSERT 또는 UPDATE를 해야 하는 상황을 자주 만나게 됩니다.이때 매우 유용한 문법이 바로 INSERT ... ON DUPLICATE KEY UPDATE입니다.즉, 쿼리 한번으로 해결 된다는 의미 인데 아무곳에서나 사용 가능한것은 아니고 키 중복이 발생하는 부분에서만 사용 하는 것입니다.그렇기 때문에 unique의 특성을 모르시는 분은 사용 하면 안되겠지요.  장점- 쿼리 수 감소: SELECT → INSERT/UPDATE 두 번 쿼리 날릴 필요 없음- 동시성 문제 감소: SELECT 후 INSERT 방식보다 Race Condition 발…
  • profile_image 웹서버에 접근하는 X-Forwarded-For란?X-Forwarded-For(XFF)는 HTTP 헤더로 클라이언트가 프록시나 로드 밸런서를 거쳐 웹 서버에 접속할 때 원래 클라이언트의 IP 주소를 식별하기 위해 사용 됩니다.로그밸런스도 프록시서버의 변형된 형태가 있기 때문에 쉽게 프록시 서버라고 생각을 하면 쉽습니다.일반적으로 웹 서버는 직접 연결된 IP만 볼 수 있는데 프록시 뒤에 있으면 프록시 서버의 IP만 보이게 되는데 이런 경우 XFF 헤더가 실제 사용자 IP를 전달하는 역할을 합니다. ▷ 헤더 형식X-Forwarded-For: 클라이언트IP 프록시1 프록시2 ...여러 프록시를 거치면 쉼표로 구분되어 …
  • profile_image ifconfig는 초기 한번 정도만 사용하고 interface configuration의 약자로 리눅스/유닉스 시스템에서 네트워크 인터페이스를 설정하고 확인하는 명령어입니다.▷ ifconfig 주요 용도1. 네트워크 인터페이스 정보 조회  - 현재 활성화된 네트워크 인터페이스 목록 확인  - 각 인터페이스의 IP 주소, MAC 주소, 서브넷 마스크 확인  - 네트워크 통계 정보 (전송/수신 패킷 수, 에러 등) 확인2. 네트워크 인터페이스 설정  - IP 주소 할당 및 변경  - 서브넷 마스크 설정  - 브로드캐스트 주소 설정  - MTU(Maximum Tr…
  • profile_image 결론부터 말하면 느리게 다운로드 처리 하는 방식에 대한 것입니다.왜? 느리게 다운로드가 필요한가 하면 지연을 시키면 트래픽이 평탄화 되는 효과가 있는데 갑자기 순간적으로 팍 튀는 그런 현상을 없애기 위해서 필욯나 방법중 하나 입니다. 원리는 간단하며 읽은 만큼 내보내고 약간 지연 시키는 방식 입니다.    /**     * 청크 단위로 지연시키면서 파일 다운로드 (대용량 파일용)     *     * @param string $filePath 다운로드할 파일 경로     * @param …
  • profile_image 쿠키를 너무 많이 생성하면 브라우저에 문제가 발생 할 수 있고 작동을 하지 않습니다.자동으로 초기화 해주면 좋은데 그렇지 않기 때문에 헤더에서 페이지 읽을때 마다 체크 해서 자동삭제 해주는 프로그램 있으면 문제가 발생 하지 않도록 할 수 있습니다. 아래는 어디에서 이런 문제가 발생 했는지 쿠키 이름이라도 저장하는 기능이 있으면 좋을텐데 그 부분은 빠져 있으니 필요하신 분은 간단한 작업이므로 넣으셔서 사용하시면 됩니다.  <?php  class CookieManager {      private $maxHeaderSize = 4096;  // 일반적인 헤…
  • profile_image 프레임 워크에서도 사용하는 방식중에서 간편하게 사용하는 방식의 소개 입니다.기본 구조는 전통적인 방식으로 가독성과 빠른 처리가 장점 이면서 include를 쉽게 처리 하는 방식으로 다음과 같습니다. 우선 기본구조는 아래 형태를 가지게 되고project/│ config.php├─ include/│   ├ inc_header.php│   ├ inc_footer.php│   └ functions.php├─ app/│   ├ post_detail.php│   ├ post_list.php│   └ category_…

상업적 이용 금지. 컨텐츠는 개인 용도로만 사용이 가능 합니다.