티스토리 뷰


해당 포스트는 윈도우를 기반으로 한 포스트 입니다. 리눅스가 아니니 리눅스를 찾아오신 분은 돌아가 주세요..



안녕하세요 박스여우입니다.

오늘은 java와 window command를 이용해서 프로세스를 다루는 방법을 알아보고자 합니다.

갑자기 리눅스도 아니고 윈도우에서 프로세스를 다루려고 하는 이유는 한 회사에서 의뢰를 받아 프로그램을 개발중인데 만들다 보니 프로세스를 다뤄야 하는게 많더군요. 서버가 윈도우라 윈도우에서 하는 방법을 알아보고 있습니다.


특정 포트 사용중인 프로세스 ID 찾기

우선 cmd 창을 열고 netstat -a -o 요 명령어를 치면 현재 포트를 사용중인 프로세스에 대한 정보가 출력됩니다.



프로토콜,IP:포트,User,상태,프로세스 아이디 순으로 정렬되어 출력됩니다. 이를 이용해서 특정 포트를 사용중인 프로세스를 구해보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public int getProcessID(int port) throws IOException {
        Process ps = new ProcessBuilder("cmd""/c""netstat -a -o").start();
        BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
        String line;
        while ((line = br.readLine()) != null) {
            if (line.contains(":" + port)) {
                while (line.contains("  ")) {
                    line = line.replaceAll("  "" ");
                }
                int pid = Integer.valueOf(line.split(" ")[5]);
                ps.destroy();
                return pid;
            }
        }
        return -1;
    }
cs


6번째 줄에서 해당 포트를 사용중인 프로세스의 정보를 가져오기 위해 체크를 하고 해당 라인 자체를 가져 왔습니다.

그리고 여러번의 띄어쓰기로 구분되어있는 표를 split하기 위해서 replace를 이용해 하나로 묶고 split한 뒤에 5번 인덱스의 프로세스 아이디를 가져왔습니다.




 그외의 프로세스 다루는 명령어


제가 프로세스 아이디를 가져온 이유는 바로 죽이기 위해서죠! 같은 포트를 사용중인 프로세스가 겹치면 포트 bind에 오류가 발생하기 때문에 그냥 먼저 실행되어 있던 프로세스를 죽여버리고  새 프로세스를 실행시킵니다.


여기서 프로세스를 죽이는 명령어는 tasklist /FI "PID eq 프로세스 아이디" 입니다. 이걸 또 java코드상에서 실행시키려면 

1
Runtime.getRuntime().exec("taskkill /F /PID " + pid);

cs

요렇게 하면 됩니다. 간단하죠?


위 말고도 서버의 남은 자원들을 알아내야 했는데, 이 역시도 cmd 명령어를 통해 해결하였습니다.


systeminfo | findstr 프로세서 - 실제 cup 개수(?)

wmic cpu get NumberOfCores - 코어 개수

wmic cpu get NumberOfLogicalProcessors - 프로세스 개수 (intel i시리즈는 하이퍼 쓰레딩으로 8프로세스)

echo %NUMBER_OF_PROCESSORS%


typeperf "\Processor(_Total)\% Processor Time"  - cpu 처리속도(?)

wmic cpu get loadpercentage - cpu 로드된 %

@for /f "skip=1" %p in ('wmic cpu get loadpercentage') do @echo %p%


tasklist /FI \"PID eq 프로세스 아이디"  등 입니다..


복잡해 보이지만 쓰다보면 간단한 명령어들이라고 느끼게 될겁니다.



요즘 너무 바빠서 포스팅을 자주 하지 못했습니다.. 가끔 한다고 하더라도 가벼운 주제들만 다뤄서 뭔가 블로그의 수준이 낮아지는 것 같네요.. 7월달 부터는 열심히 공부하도록 하겠습니다!






댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함