서버 디스크용량 부족한지 체크하는 프로그램 > PHP
PHP

서버 디스크용량 부족한지 체크하는 프로그램

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

MRTG나 각종 관제용 프로그램을 사용하는곳에선 필요하지 않지만 소규모로 운영하는 곳은 이런것이 필요 합니다.

그리고 은근히 디스크용량 때문에 발생하는 문제 들이 있습니다.



 

나도 모르게 로그가 많이 쌓여서 disk full 만들어 다른 문제를 야기 시키죠

충분한 디스크 용량이 있으면 괜찮은데 그렇지 아니한 경우는 반드시 이러한 프로그램이 필요 합니다.

이렇게 하여 SMS나 텔레그램 같은 곳으로 전달을 받아 운영 관리를 하면 되겠지요.

 


    class DiskUsageChecker {

        /** @var int 사용률 임계값 (%) */
        private $iThreshold = 95;

        public function __construct($iThreshold=95) {
            $this->iThreshold = $iThreshold;
        }

        /**
         * df 명령을 실행하여 사용률이 임계값(iThreshold)을 초과하는 디스크 정보를 배열로 리턴합니다.
         * NFS, NFS4, CIFS 파일 시스템은 제외합니다.
         *
         * @return array<int, array<string, string>> 사용률이 높은 디스크 정보 배열.
         * 각 요소는 ['sTotalSize', 'sAvailableSize', 'sMountedOn', 'sUsagePercent'] 키를 가집니다.
         */
        public function getHighUsageDisks(): array {
            // 실행할 df 명령어 (nfs, nfs4, cifs 제외)
            // -P 옵션은 출력을 POSIX 형식으로 표준화하여 파싱을 쉽게 합니다.
            $sCommand   = "df -P -x nfs -x nfs4 -x cifs 2>/dev/null";

            $aOutput    = [];
            $iReturnVar = 0;

            exec($sCommand, $aOutput, $iReturnVar);
            if ($iReturnVar !== 0 || empty($aOutput)) {
                return [];
            }

            $aHighUsageDisks = [];
            array_shift($aOutput);
            foreach ($aOutput as $sLine) {
                $aParts = preg_split('/\s+/', $sLine, -1, PREG_SPLIT_NO_EMPTY);

                if (count($aParts) < 6) {
                    continue;
                }

                $sUsedPercentRaw = $aParts[4];
                $iUsedPercent    = (int)rtrim($sUsedPercentRaw, '%');

                // 사용률이 임계값(iThreshold)을 초과하는지 확인
                if ($iUsedPercent > $this->iThreshold) {
                    // 결과 배열에 필요한 정보만 저장
                    $aHighUsageDisks[] = [
                        'sTotalSize'     => $this->formatSizeFromKb($aParts[1]),
                        'sAvailableSize' => $this->formatSizeFromKb($aParts[3]),
                        'sMountedOn'     => $aParts[5],
                        'sUsagePercent'  => $sUsedPercentRaw,
                    ];
                }
                // $aHighUsageDisks[] = [
                //     'sTotalSize' => $this->formatSizeFromKb($aParts[1]),
                //     'sAvailableSize' => $this->formatSizeFromKb($aParts[3]),
                //     'sMountedOn' => $aParts[5],
                //     'sUsagePercent' => $sUsedPercentRaw,
                // ];
            }

            return $aHighUsageDisks;
        }

        /**
         * df -P의 1K-blocks 값을 사람이 읽기 쉬운 용량 단위(GB, MB 등)로 변환합니다.
         *
         * @param string $sKbBlocks df -P에서 얻은 1K-blocks 값
         * @return string 변환된 용량 문자열
         */
        private function formatSizeFromKb(string $sKbBlocks): string {
            $iBytes = (int)$sKbBlocks * 1024; // 1K-blocks * 1024 = Bytes
            $aUnits = ['B', 'KB', 'MB', 'GB', 'TB'];
            $i      = 0;

            if ($iBytes === 0) {
                return '0B';
            }

            while ($iBytes >= 1024 && $i < count($aUnits) - 1) {
                $iBytes /= 1024;
                $i++;
            }

            return round($iBytes, 1) . $aUnits[$i];
        }
    }

 



    $oChecker       = new DiskUsageChecker(86);
    $aCriticalDisks = $oChecker->getHighUsageDisks();

    $msg = '';
    if (empty($aCriticalDisks)) {
        echo "사용률이 95%를 초과하는 디스크는 없습니다. \n";
    } else {
        $msg =  " 디스크 사용율 초과 서버: $HOST_NAME \n";
        foreach ($aCriticalDisks as $aDisk) {
            $msg .= "----------------------------------\n";
            $msg .= "마운트된 곳: " . $aDisk['sMountedOn'] . "\n";
            $msg .= "사용률: " . $aDisk['sUsagePercent'] . "\n";
            $msg .= "전체 용량: " . $aDisk['sTotalSize'] . "\n";
            $msg .= "남은 용량: " . $aDisk['sAvailableSize'] . "\n";
        }
        $msg .= "----------------------------------\n";
    }
    echo $msg;
 
  • 페이지 주소 복사
  • 페이스북으로 공유
  • X 로  공유
  • 트위터로  공유
  • 네이버 블로그로 공유
  • 네이버 카페 공유하기
  • 네이버 라인 공유하기
  • 네이버 밴드 공유하기
  • 링크드인으로 공유하기
  • 핀터레스트에 공유하기
전체 229건 1 페이지
  • profile_image 프레임 워크에서도 사용하는 방식중에서 간편하게 사용하는 방식의 소개 입니다.기본 구조는 전통적인 방식으로 가독성과 빠른 처리가 장점 이면서 include를 쉽게 처리 하는 방식으로 다음과 같습니다. 우선 기본구조는 아래 형태를 가지게 되고project/│ config.php├─ include/│   ├ inc_header.php│   ├ inc_footer.php│   └ functions.php├─ app/│   ├ post_detail.php│   ├ post_list.php│   └ category_…
  • profile_image 결론부터 말하면 별 문제 없습니다. 오래된것이라는것에 대해 단어에서 '오래된' '옛말부터사용한' 이런 단어를 희안하게 부정하는 뇌를 가지는 경우가 있는데 아직까지 사용되고 있다는것은 쓸모가 있다는것이기도 합니다. 문제 없다고 보지만 혹시 잘못 생각했거나 최근들어 바뀌었을 수 있기 때문에 LLM에 아래와 같이 물어 보았습니다.php로 웹사이트를 만들려 하는데 구조를 난 예전 방식으로 - 왜냐하면 가장 속도가 빠르고 가독성이 좋아include 보안 및 config 및 공통파일include inc_heaer.php비즈니스 로직include inc_footer.php이런 방식으로 하려 하는데 혹시나 내가 잘못 생각하는…
  • profile_image 여기서의 예는 데이터베이스 접근을위한 정보를 생성자에 넣어주는데 이것이 디버깅할때 보이는 문제를 해결 하기 위한 것입니다.결론부터 말하면 디버그용 매직메소드를 사용하면 됩니다. print_r() 같은 것으로 디버깅하기 위해서 화면 출력을 하면 private의 변수 값이 출력 되는데 이를 방지 하기 위한 예를 들면 다음과 같습니다.    class MysqliDatabase    {        private $masterInfo = ['password' => 'secret123'];        pr…
  • profile_image 단축URL을 만드는 목적엔 여러가지가 있지만 QR코드를 사용하기 위해서도 많이 사용됩니다.유튜브의 주소도 끝을 보면 단축URL처럼 코드로 되어 있지요 만드는 기본만 알면 되는데 원리는 간단하고 다음과 같습니다.이것만 알면 나머지는 뚝닥뚝닥 만들면 되기 때문입니다.1) 우리는 DB에 넣을때 고유한 번호의 숫자를 레코드 관리를 위해 넣어줍니다. 보통 id란 컬럼을 사용2) 이 숫자는 10진수 인데 이걸 62진수 같은것으로 만듭니다. 이게 우리가 보는 단축URL 코드3) 단축URL 사이트는 짧을 수록 좋기 때문에 짧은 도메인 생성4) QR코드 라이브러리 활용해서 QR코드 만들면 됩니다.    /**…
  • profile_image 스케줄러에 등록된 프로그램에서 특정 함수 사용하는것이 있을 경우 어느 프로그램에서 사용하는지 알고 싶어서 만들게 된 프로그램 입니다.사용은 이렇게 했지만 반드시 그럴 필요는 없지요.특정 약간 수정해서 특정 디렉토리에 있는것을 찾을 수도 있고. 웬만한것은 쉘스크립트로도 가능할듯.         // cron_php_word_search_functions.php    // 설명: crontab/스케줄러 파일들을 읽어서 php 파일 경로를 찾아    //       해당 php 파일 내용에 미리 지정한 단어들이 있는지 …
  • profile_image 장시간 실행 시키는 프로그램이 있는데 죽네요.그냥 죽기나 하면 자원 소모가 없을것인데 .... 애가 멈춘현상이 있어 프로세스를 강제로 종료해야 되는 상황인데 API 호출 하면서 거기서 문제가 있는듯 합니다. 내부 구조는 난 모르겠고 다시 받으면 되기 때문에 무한 루프 돌면서 파일 갱신 시간이 1분 넘었으면 무조건 kill 처리하고 다시 실행 시키는 프로그램 입니다.이때 사용하는 것인데 대략 다음과 같습니다.이건 당연히 웹서버가 아니라 리눅스 쉘에서 높은 권한으로 실행시키는 프로그램 입니다. 혹시 PHP라고 하니 웹브라우저를 통해 웹서버에서 실행한다고 생각 하시는 분은 없겠죠?시스템에 따라 다를…

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