블로그 이미지
초딩입맛제주아재
하고 싶은 것만 하며 살고 싶다

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

'cli'에 해당되는 글 2

  1. 2006.08.21 자동 로그 뷰어
  2. 2006.07.24 간단한 대화식 프로그램
2006. 8. 21. 21:02 Programing/아뜰리에

이번에 국제전화카드 쇼핑몰 프로젝트를 끝내고
로그파일을 하루 종일 지켜보고 있어야 하는 상황에서
출근하자마자 그날의 로그파일을 새로 tail -f 로 모니터링 해야했다.
그일이 불편하여 자동으로 새로운 로그파일을 모니터링 할 스크립트를 만들어봤다.

사용법 :
우선 해당 소스를 실행 모드로 설정 : chmod 777 LogViewer
LogViewer 실행
끝~

코드를 보자.
tail -f 를 직접 구현하고자 하니 여간 어려운게 아니었다.
쉬워보여서 뛰어든건데 -_-
하지만 막상 구현이 끝나니...
이게 뭐야 -_-;;;

아무튼 소스는 주석의 내용만으로 충분히 이해가 갈듯하다.

#!/usr/local/php5/bin/php -q
<?php
/**
* FILE_NAME : LogViewer
* AUTHOR    : asrada2001@hotmail.com
* DATE      : 2006-08-21
* DESC      : 로그파일 자동 뷰어
               - 일별 또는 월별 등 날짜로 명명되어진 로그파일을 보여준다.
               - 날짜 변경시 자동으로 다음 로그파일을 보여준다.
* LICENSE   :
**/

$filehead = 'logfile head';     //로그파일구성 = 헤드(유무) + 날짜(항목은 상황에 맞게 설정)
$basic_readline = 5;
$current_file = Null;
$firstopen = true;

while(true){

  $filetail   = date('Ymd');
  $filename   = $filehead.$filetail;

  if($current_file != $filename){
       echo "===============================================================\n";
       echo "##  New LogFile Watching -- ".$filetail."\n";
       echo "===============================================================\n";

       $current_file = $filename;
       $last_pos = Null;
       $firstopen = true;
  }

  if(file_exists($filename) == true){

       if(filesize($filename) == 0){
           continue;
       }

       $readline   = 0;
       $first_pos  = Null;
       $result     = Null;

       $fp = fopen($filename,'r');

       $pos       = -2;                //파일의 마지막 문자가 \n 이므로 -2 부터 시작
       $char      = Null;

       while(fseek($fp,$pos,SEEK_END) == 0){
           $char = fgetc($fp);

           if($char == "\n" || $char == "\r"){
               $str = fgets($fp);
               $this_pos = ftell($fp);

               if($this_pos == false){
                   break;
               }

               $readline++;

               //열려진 파일의 최초 검색된 new line(\n) 의 포인터 위치를 저장하여
               //다음번 로딩시에 이 포인터 이전의 내용은 검색을 제한한다.
               if($first_pos == Null){
                   $first_pos = $this_pos;
               }

               //이전 파일의 마지막 포인터의 위치
               //현재 포인터가 이전 파일의 마지막 포인터와 같은 값을 갖을때 검색을 중지한다.
               if($last_pos == $this_pos){
                   break;
               }

               //출력되어질 로그파일의 내용
               $result = $str.$result;

               //최초 파일 오픈할때는 마지막 5라인 출력
               if($firstopen == true){
                   //echo "============= first_line cashing....".$readline." ========================\n";

                   if($readline == $basic_readline){
                       $firstopen = false;
                       $readline = 0;
                       break;
                   }
               }else{
                   if($last_pos == Null){
                       break;
                   }else{
                       if($this_pos <= $last_pos){
                           break;
                       }
                   }
               }
           }

           $pos--;
       }

       $last_pos = $first_pos;

       if($result != Null){
           echo $result;
       }

       fclose($fp);
       unset($fp);

       sleep(1);

  }
  else{
       echo $filename." << file not found...\n";
       sleep(10);
  }
}
?>

필요에 의한 개발...
필요라는 동기가 무척이나 중요한것 같다.
만약 이번 프로젝트가 없었다면
언제 이런걸 만들어볼까~~~

posted by 초딩입맛제주아재
2006. 7. 24. 01:00 Programing/PHP

PHP를 단순 동적 웹사이트 제작에만 사용하는것은
PHP의 반만 쓰는 것이다.
PHP는 펄,본쉘 같은 쉘스크립트로서의 역할도 훌륭히 수행해 낼 수 있다.
물론 태생이 쉘스크립트인 것들에 비하면 기능이 다소 빈약하지만
웬만한 작업은 해낼수 있다.

요즈음 PHP로 어떤 것들을 할 수 있을까 하는 고민을 하면서
가장 쉽고 빠르게 할 수 있는것을 찾다가
간단한 대화식 프로그램을 짜보기로 했다.

#!/usr/local/php5/bin/php
<?php
set_time_limit(0);

$fd = STDIN;

if (!$fd)
  exit;

$question = "How old are you? ";

echo $question;

while (!feof ($fd)){
  $s = trim(fgets($fd,128));

  if ($s==false){
       continue;
  }

  if($s == 'exit'){
       break;
  }

  if(is_numeric($s) == false){
       echo "\nAre you kidding??\n\n\nTry again...\n\n".$question;
  }

  if($s > 30){
       echo "\nHum...You are not fresh...\n\n";
       break;
  }

  if($s == 28){
       echo "\nOh~~ Very Fantastic age~!!! You are good!!\n";
       break;
  }

  if($s < 30){
       echo "\nWe are the youngman!!!\n";
       break;
  }
}

echo "\n\n======= Bye~ ============!!\n";

?>



위 소스는 간단한... 대화형은 아니고 한번 묻고 한번 답하면 종료한다.
1번 라인에 php의 경로를 지정해 줌으로써 cli 모드로 실행이 되도록 하였으니
chmod로 실행권한을 주면 쉘에서 실행이 가능하다.

위 소스를 응용하면 간단한 머드게임도 가능할것 같다.

GTK와 결합하면 머그게임으로???

'Programing > PHP' 카테고리의 다른 글

[OSX] Eclipse에서 PHP 로컬 개발/테스트 환경 구축하기  (4) 2008.08.30
Enabling PHP and Apache in Leopard  (2) 2008.08.19
WAV파일 분석  (0) 2006.11.10
간단한 소켓통신  (0) 2006.10.13
시스템 모니터링 툴  (0) 2006.07.17
posted by 초딩입맛제주아재
prev 1 next