쉘에서 계정용량 출력하여 MySQL에 추가하기

사용자들의 계정확인 페이지에서 계정용량을 확인할 수 있도록 제공하고 있는데 JSP페이지에서 시스템명령을 직접 수행하고 있다.

수행결과는 잘 나오고 있지만 문제는 가끔 Tomcat 서버가 다운이 된다는 것. 톰캣 서버의 로그를 자세히 살펴보기에는 너무 힘들어서 톰캣 서버 다운 문제가 혹시 이 문제가 아닌가 싶어서 계정용량 제공방식을 변경해보기로 했다.

계정용량을 cron을 통해 주기적으로 확인하여 MySQL 데이터베이스에 저장하고 계정용량을 표시할 때는 MySQL의 정보를 뽑아서 보여주기만 하면 된다.

일단 계정용량을 뽑는 명령은 다음과 같다.

du -shm /home/사용자ID | awk -F ‘[t]’ ‘{print $1}’

du 명령어의 출력결과를 파이프라인을 통해 재처리하는 것인데 처음에는 grep이나 cut 등의 명령으로 수행해봤지만 du 명령의 결과가 탭으로 구분되어있기 때문에 제대로 작동하지 않았다. awk 명령으로 가능할 것 같아서 찾아보니 한참을 찾아내어 위 명령어를 만들었다. 수행해보니 제대로 작동한다.

이제 이 명령어를 MySQL 데이터베이스에 추가하기만 하면 된다.

JSP를 응용하여 계정용량 파악해보기

내 서버에서는 무료로 웹호스팅 서비스를 운영 중인데 사용자지원페이지를 만들어보았다.

사용자지원페이지에는 현재 계정용량 파악하기라는 메뉴를 넣기로 했는데 정작 사용자 계정용량 파악하는 방법을 찾을 수 없었다는 것.

그래서 예전에 PHP로 만들었던 기억과 구글에서 찾은 몇가지 정보를 더하여 계정용량 검색기능을 만들어보았다.

일단 리눅스서버에서 쓰는 계정용량 검색 명령어는 ‘du -shm /home/계정ID’의 형태이다. 이 시스템명령어를 수행하여 결과값을 가져오면 된다는게 기본 원리.

<%@page import="java.io.InputStreamReader"%>
<%@page import="java.io.BufferedReader"%>
<%
String command = "du -shm /home/" + id;

//계정 총용량 구하기
String info_space = "";
Process p = null;
BufferedReader br = null;

try {
    p = Runtime.getRuntime().exec(command);
    br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line = null;
    while ((line = br.readLine()) != null) {
        line = line.split("/")[0].trim();
        info_space = "약 " + line + " MByte";
    }
} catch (Exception e) {
    info_space = "계정 총용량을 확인할 수 없습니다.";
}
%>

자바에서는 시스템명령을 수행할 때 Runtime 클래스를 사용하면 된다. 이 클래스를 사용해서 돌아온 결과값을 while을 이용하여 읽어들이면(여기에서 BufferedReader와 InputStreamReader 클래스가 필요하다.) 명령을 수행한 결과를 알 수 있다.

내가 뽑고 싶은건 계정사용 공간이었는데 리눅스의 du -shm 명령어는 잡다한 글귀가 붙어있기 때문에 이것을 split와 trim 함수를 이용해서 필요한 부분만 잘라주었다. 이 부분은 아마 정규표현식이나 아니면 다른 어떠한 방법으로 더 간단히 할 수 있을 것 같지만 일단 내가 아는 명령어는 이정도이므로. du 명령어의 옵션으로 준 -h는 사람이 읽기 쉬운 형태로 보여준다. 예를 들면, 기가바이트 단위의 데이터는 G로 메가바이트는 M로 표시해준다. 일관성이 없어지기 때문에 웹페이지에서도 이것을 표시할 때 일관성이 없어지게 되므로 추가해서 -m 옵션을 주어서 무조건 Mega Byte 단위로 처리하게 만들었다.

이 방법을 이용하면 생각보다 쉽게 계정용량을 MByte 단위로 환산하여 출력할 수 있게 된다.

한가지 주의할 점은 생각보다 계정용량이 정확하게는 표시되지 않는다. 또한 자바의 Runtime 클래스는 어찌된 영문인지 접근권한에 상관 없이 실행될 수 있는 것 같다. 악의적인 사용자가 rm 등의 명령어를 사용할 시 크게 문제가 될 수 있을 수 있으니 실행할 명령어를 파라미터로 받아서 수행한다거나 하는 경우는 절대 없어야 할 것 같다.