안녕! 개발자의 세계에서 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();
}
}
}
요점:
- find로 로그 파일을 찾아.
- grep으로 특정 키워드(error)를 검색해.
- 모든 작업이 Java 안에서 진행되니 정말 편리하지?
마무리하며
Process 클래스는 우리에게 운영 체제와의 대화를 가능하게 만들어주는 멋진 도구야. 이걸 잘 활용하면 시스템 관리자와 같은 역할을 Java 코드로 손쉽게 할 수 있단다. 오늘 배운 내용을 꼭 실습해 보고, 나만의 프로세스 관리 도구를 만들어보는 건 어때?
'개발 > Java' 카테고리의 다른 글
[Java] Java로 파일 업로드 쉽게 해봐요!!! (0) | 2025.01.06 |
---|---|
[Java] 서버에 있는 파일 다운로드 코드를 쉽게 만들어보자! (0) | 2025.01.06 |
[Java] Equals는 왜 중요한가? (0) | 2024.12.23 |
[Java]Java로 오늘이 몇 주차인지 알아보기! (코딩으로 달력 읽는 마법 배우기) (1) | 2024.12.18 |
[Java] Java의 세션 키를 생성하고 사용하는 방법! (1) | 2024.12.17 |
댓글