본문 바로가기
개발/Java

[Java]마법 같은 Process 클래스와 Unix 파일 찾기 모험

by 쓸있쏜 2025. 1. 8.

안녕! 개발자의 세계에서 20년 동안 함께한 Java에 대해 이야기할게. 오늘은 Java의 숨겨진 보석 중 하나인 Process 클래스와 함께 Unix 파일 탐험을 떠나보자. 이 클래스는 마치 마법의 지팡이 같아서, 시스템 명령어를 실행할 때 엄청 유용하단다.


Process 클래스란?

먼저 Process 클래스가 뭐냐고? 쉽게 말하면, Java로 시스템의 운영 체제와 대화할 수 있게 해주는 친구야. 이 친구는 우리에게 운영 체제 명령어를 실행하고 그 결과를 Java 프로그램으로 가져올 수 있는 능력을 준단다. 멋지지 않아?

아, Process 클래스는 직접 객체를 만들 수 없어서 보통 ProcessBuilder나 Runtime 클래스를 이용해야 해. 조금 까다로워 보일 수도 있지만, 걱정하지 마! 내가 차근차근 알려줄게.


Process 클래스로 Unix에서 파일을 조회하기

우리 첫 번째 모험은 간단한 파일 조회야. 예를 들어 ls 명령어로 현재 디렉터리에 있는 파일 목록을 가져오는 걸 해볼 거야.

import java.io.*;

public class FileExplorer {
    public static void main(String[] args) {
        try {
            // ProcessBuilder로 시스템 명령어 실행 준비
            ProcessBuilder builder = new ProcessBuilder("ls", "-l");
            builder.redirectErrorStream(true); // 오류 스트림을 표준 출력으로 합치기
            
            // Process 실행
            Process process = builder.start();
            
            // 명령어 결과 읽기
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    System.out.println(line);
                }
            }

            // Process 종료 상태 확인
            int exitCode = process.waitFor();
            System.out.println("명령어 종료 코드: " + exitCode);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

요점:

  • ls -l 명령어를 사용해 파일 목록을 가져와.
  • BufferedReader로 명령어 실행 결과를 읽을 수 있어.
  • 마지막으로 process.waitFor()로 명령어가 잘 끝났는지 확인!

파일을 찾는 명령어? find로 해결!

두 번째 모험은 파일 찾기야. Unix에서는 find 명령어를 많이 쓰지? 이번엔 특정 디렉터리에서 txt 확장자를 가진 파일을 찾아보자.

import java.io.*;

public class FileFinder {
    public static void main(String[] args) {
        try {
            // find 명령어 준비
            ProcessBuilder builder = new ProcessBuilder("find", ".", "-name", "*.txt");
            builder.redirectErrorStream(true);

            Process process = builder.start();

            // 결과 읽기
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    System.out.println("찾은 파일: " + line);
                }
            }

            int exitCode = process.waitFor();
            System.out.println("명령어 종료 코드: " + exitCode);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

요점:

  • find . -name "*.txt"는 현재 디렉터리에서 모든 .txt 파일을 찾아줘.
  • 결과를 하나씩 출력하면서 마치 보물을 찾는 기분이 들어!

ProcessBuilder와 Runtime의 차이?

아, 맞다! 혹시 "Runtime도 Process를 실행한다던데 뭐가 다른 거야?"라고 궁금하다면, 차이를 간단히 알려줄게.

  • ProcessBuilder: 더 정교하게 프로세스를 설정할 수 있어. 예를 들어 환경 변수나 작업 디렉터리를 설정할 때 사용해.
  • Runtime.getRuntime().exec(): 빠르게 명령어를 실행할 수 있지만, 설정을 변경하는 게 어렵단다.

둘 다 쓰임새가 다르니 필요에 따라 골라 쓰면 돼!


현실에서 Process 클래스 활용하기

이제 좀 더 재미있는 예를 들어볼게. Process 클래스를 이용해 Unix 시스템에서 특정 디렉터리에 있는 로그 파일을 모두 찾아보고, 그 로그 파일에서 특정 키워드가 있는지 확인한다고 생각해 봐.

import java.io.*;

public class LogAnalyzer {
    public static void main(String[] args) {
        try {
            // 로그 파일 찾기
            ProcessBuilder findLogs = new ProcessBuilder("find", "/var/logs", "-name", "*.log");
            findLogs.redirectErrorStream(true);

            Process process = findLogs.start();

            try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
                String file;
                while ((file = reader.readLine()) != null) {
                    System.out.println("분석 중: " + file);

                    // grep으로 키워드 찾기
                    ProcessBuilder grep = new ProcessBuilder("grep", "-i", "error", file);
                    grep.redirectErrorStream(true);

                    Process grepProcess = grep.start();

                    try (BufferedReader grepReader = new BufferedReader(new InputStreamReader(grepProcess.getInputStream()))) {
                        String line;
                        while ((line = grepReader.readLine()) != null) {
                            System.out.println("키워드 발견: " + line);
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

요점:

  1. find로 로그 파일을 찾아.
  2. grep으로 특정 키워드(error)를 검색해.
  3. 모든 작업이 Java 안에서 진행되니 정말 편리하지?

마무리하며

Process 클래스는 우리에게 운영 체제와의 대화를 가능하게 만들어주는 멋진 도구야. 이걸 잘 활용하면 시스템 관리자와 같은 역할을 Java 코드로 손쉽게 할 수 있단다. 오늘 배운 내용을 꼭 실습해 보고, 나만의 프로세스 관리 도구를 만들어보는 건 어때?

 

댓글