블로그 이미지
물결(Wave)
하고 싶은 것만 하며 살고 싶다

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
31            
2007.03.05 19:47 Programing/아뜰리에
리눅스 명령어중 du는 디스크 사용량을 알려준다.
그런데 du만으로는 뭔가 부족하다.
50메가 이상 사용중인 디렉토리 목록을 보고 싶은데 help를 봐도 내가 원하는 옵션은 없는것 같다.
혹, 나만 모르고 있는 방법이 있을지도 모르겠다.
리눅스가 워낙 막강하니...

그래서 만들었다.
du를 활용해서 내가 원하는 50메가 이상 사용중인 디렉토리를 볼 수 있는 '커스터마이징 du'!!

#!/usr/local/php/bin/php -q
<?php
/**
* filename : mydu(.php)
* author   : asrada2001@hotmail.com
* date     : 2007-03-05
* desc     : 디스크 사용량(du)체크
*
* 사용법 *
*
* chmod로 실행권한(755)을 주면 프롬프트에서 mydu를 타이핑 하는 것으로 실행이 된다.
*
* ~root]# mydu [opt]
* [opt]: 옵션=값
*
* 옵션
* su : 인자 값으로 받은 사이즈보다 큰 결과만 출력
* sd : 인자 값으로 받은 사이즈보다 작은 결과만 출력
* md : max depth
**/

function get_num($val){
 
$temp = '';
  for(
$i=0,$max=strlen($val); $i<$max; $i++){
     
$txt = substr($val,$i,1);
      if(
is_numeric($txt) == true){
         
$temp .= $txt;
      }else if(
$txt == '.' && $temp != ''){
         
$temp .= $txt;
      }
  }
  return
$temp;
}

function
to_kb($val){
 
$num = get_num($val);
 
$unit = strtoupper(substr($val,-1));
  switch(
$unit){
      case(
'M'):
          return
$num * 1024;
      break;
      case(
'G'):
          return
$num * 1024 * 1024;
      break;
      case(
'K'):
          return
$num;
      break;
  }
}

function
print_help(){
  echo
"\n\t[Options]\n"
     
."\tsu=size : size 보다 큰 결과만 출력합니다.\n"
     
."\tsd=size : size 보다 작은 결과만 출력합니다.\n"
     
."\tmd=depth : 출력할 하위 디렉토리 단계를 설정합니다.\n\n"
     
."\t\t예)mydu sd=10M md=4\n\n";
}

$opt = '';

if(
sizeof($argv) > 1){
  for(
$i=1,$max=sizeof($argv); $i<$max; $i++){
     
$tmp_opt = explode('=',$argv[$i]);
     
$tmp_name = $tmp_opt[0];
     
$tmp_value = $tmp_opt[1];
      switch(
$tmp_name){
          case(
'md'):
             
$opt .= ' --max-depth='.$tmp_value;
          break;
          case(
'su'):
             
$size_up = to_kb($tmp_value);
          break;
          case(
'sd'):
             
$size_down = to_kb($tmp_value);
          break;
          case(
'/?'):
             
print_help();
              exit;
          break;
          default:
              echo
"\n[".$tmp_name."] is invalid option...\n";
             
print_help();
              exit;
          break;
      }
  }
}

$command = 'du -h'.$opt;
exec($command,$result);

foreach(
$result as $data){
 
$data_size = substr($data,0,strpos($data,"\t"));

  if(
$size_up != ''){
      if(
$size_up <= to_kb($data_size)){
          echo
$data."\n";
      }
  }else if(
$size_down != ''){
      if(
$size_down >= to_kb($data_size)){
          echo
$data."\n";
      }
  }else{
      echo
$data."\n";
  }
}
?>




php, 역시 속도가 문제다.
C를 잘한다면 du소스를 직접 수정해서 컴파일하겠건만...-_-;;
늘 그렇듯 리팩토링의 여지는 남겨둔다...(귀차니sm)
신고
posted by 물결(Wave)
TAG du
2007.01.26 21:09 Programing/아뜰리에

사용자 삽입 이미지

메모보드 열기



Drag & Drop 중 Drop을 뺀
메모보드입니다.



소스파일 다운로드

- 소스파일 받아 가시는것에 제한은 없습니다. 흔적만 남겨주세요 ^^;



:log:
======================================================
2007-02-01
 로그인 기능 완성(관리자에 한함)
  ->관리자 로그인만 허용하며, 관리자 로그인이 이루어지면 관리자가 작성한 메모 로드.
  ->로그아웃하면 관리자가 작성한 메모만 화면에서 제거

2007-01-31
  로그인 버튼과 로그인창 추가
  ->개인별 메모 관리 기능을 추가 하기 위함

2007-01-26
  메모 삭제 DB연동
  LOCK 버튼 클릭시 메모 좌표 DB저장

2007-01-22
DB연동
  -> 메모지 정보(좌표,내용 ) Save/Load

2007-01-20
  메모 내용 수정 완료 버튼 추가
  -> 수정후 완료 버튼 누르면 textarea 는 사라지고 내용을 파싱해서 HTML 태그로 만들어 메모지에 붙임.

2007-01-19
  메모 이동시 다른 메모에 의해 방해 받는 문제 수정
  -> 이동중인 메모의 zIndex를 최대치로 설정하고 이동이 끝나면 원래 zIndex로 설정.

2007-01-17
  HTML,JavaScript 코딩 시작.
  메모 Drag
  메모 기본위치 설정/원위치
  메모 생성
  메모 삭제
  메모 수정 모드(저장안됨)

2007-01-16
  기본 구성 설계

신고
posted by 물결(Wave)
2006.12.12 15:05 Programing/아뜰리에
친구의 부탁으로 간단하게 만들어보았다.
실행권한을 주고 CLI모드에서 실행하면 된다.

간단하게 인자 두개를 입력 받는데
첫번째 인자값은 찾을 확장자,
두번째 인자값은 바꿀 확장자이다.

./file_rename.php php php4
이렇게 하면 현재 디렉토리 내의 확장자가 php인 모든 파일의 확장자가 php4로 바뀐다.


코드는 무척 간단하다...

#!/usr/local/php/bin/php -q
<?php
/**
* filename : file_rename.php
* author   : asrada2001@hotmail.com
* date     : 2006-12-12
* desc     : 현재 디렉토리에 존재하는 파일의 확장자 일괄 변경
**/

if(sizeof($argv) < 3 || $argv[1] == Null || $argv[2] == Null){
  echo "require two arguments...\n\n";
  exit;
}

$dir = '.';

$searchExt = '.'.$argv[1];
$replaceExt = '.'.$argv[2];

if($handle = opendir($dir)){
  while (false !== ($file = readdir($handle))){
       if($file != '.' && $file != '..' && strpos($file,$searchExt) > 0){

           $fname   = substr($file,0,strrpos($file,$searchExt));
           $newName = $fname.$replaceExt;

           if(rename($file,$newName) == true){
               echo $file.' -> '.$newName." [OK]\n";
           }else{
               echo $file.' -> '.$newName." [FALSE]\n";
           }
       }
  }

  closedir($handle);
}
?>


주의 할 것은 소스파일의 맨 윗줄을 공백으로 두면 안된다는것이다.
친구놈이 소스코드를 메신져로 던져줬더니 붙여넣기 하면서 한줄을 공백으로 비워두고는
안된다고 타박을 해댔다 -_-;;

필요에 의한 개발은 언제나 재밌다.
신고
posted by 물결(Wave)
2006.11.10 10:40 Programing/아뜰리에
2006.08.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 물결(Wave)
TAG cli, log, php
prev 1 next