쉘실행 PHP 프로그램안에서 백그라운드로 외부프로그램 실행
장시간 실행 시키는 프로그램이 있는데 죽네요.
그냥 죽기나 하면 자원 소모가 없을것인데 .... 애가 멈춘현상이 있어 프로세스를 강제로 종료해야 되는 상황인데
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);
}
좀더 우하하게? 외부 실행 시키는 방법이 있기는 하지만 사용을 안해본거라서 이렇게 처리 합니다.
