1.DOS의 CHOICE 명령 대용으로 Y/N 선택 묻기 방법
2.배치파일에서 줄 띄우기; Batch File 빈줄 넣기 방법; empty line 
3.CMD 콘솔 색깔 변경하는 명령어; 도스창 명령프롬프트 글자색 바꾸기; DOS Color 
4.영어 도스 실행 방법; 영문 DOS 사용하기; Eng 
5.현재 위치에서 도스창 열기, 현재 폴더에서 명령프롬프트(CMD) 실행하는 법 
6.BAT 메세지 출력, 배치파일 메시지 프린트 방법; Batch File Message 
7.디렉터리가 비어 있지 않습니다, 라는 에러 해결 방법은? The directory is not empty 
8.도스 디렉토리 바꾸기 명령, DOS에서 드라이브, 폴더 이동 명령어; Change Directory 사용법 
9.배치파일로 디렉토리 생성 명령어, 폴더 만들기 방법; BAT Make Directory, Folder 
10.[배치파일:도스/윈도우] echo 명령 사용법 / echo (에코) 란? 
11.윈도우에서 배치파일(Batch File) 실행하기
12.PKZIP 폴더 압축 옵션, 디렉토리까지 압축하기 방법; Folder Directory 
13.도스창 CMD 에서 파일명 변경 방법, 파일, 폴더 이름 바꾸기 명령; Rename File 
14.도스에서 텍스트 파일 보기 명령어; DOS Text File Viewer 
15.BAT 파일 엔터 키 치는 명령은? 배치파일에서 Enter Key 로 빈줄 출력 명령어 
16.Find 파일 속성, 속성으로 파일 찾기 명령어; Find File Attribute 
17.배치파일에서 파일 행번호, 줄번호 붙이기; Batch File, Print Line Number 
18.BAT 환경변수 사용 방법, 배치파일에서 환경변수; ENV 
19.파일에 출력하는 배치 파일 작성법; BAT으로 Text File 만들기 
20.배치파일 함수 구현, BAT에서 GOSUB 문 서브루틴, 고급 BATCH 테크닉 
21.배치파일 문자열 함수는? 스트링 추출 출력 방법; Batch String 
22.DOS 명령어 / 모든 도스 명령 목록; MS-DOS Command 
23.BAT 실행창, 배치파일 실행하는 창은? Batch Window 
24.24비트 32 bit 자동 전환, 구글어스 실행 배치파일; Google Earth BAT 
25.숫자 무작위 생성; 윈도우 도스창에서; DOS 랜덤 Random 
26.메모장으로 BAT 파일 만들기, 배치파일 작성하기; Windows Notepad Batch File 
27.BAK 파일 삭제 배치 파일; 백업파일 지우기 BAT 
28.배치파일 만들기 기초; BAT 파일 작성법 
29.DOS / Windows Batch 파일의 주석 처리 방법; 주석문 Remarks 
30.도스 TREE 명령어 파일로 저장하기, DOS 명령 결과, 텍스트파일로 저장하는 법 
31.배치파일에서 return 구현 방법; BAT 리턴 반환 C언어처럼 
32.도스 DOS 명령, 파일 속성 바꾸기 명령어; File Attribute ATTRIB 
33.배치파일 에디터로 좋은 것은? BAT File 편집기 Editor 종류 
34.chkdsk 하는 법; 체크디스크 명령으로 하드 검사 하는법 
35.chkdsk /F 옵션으로, 부팅 때 하드 디스크 검사하는 배치 파일 - Batch 
36.모든 하드디스크(HDD)를 한꺼번에 검사하는 배치(Batch) 파일 
37.다른 배치 파일로 GOTO 명령; 다른 파일 라벨로 이동 BAT 
38.배치파일에서 시스템경로 구하기; 패스 환경변수 Path Batch File 
39.배치 파일에서, 숫자 계산하기, set 명령으로 더하기 빼기; Batch File Calc 
40.배치파일 무한루프 구현, 루프 탈출, 빠져 나오기 예제; Batch File Infinity Loop 
41.파일 개수 세기 도스 명령어; File Counter DOS Command 
42.배치파일 BAT] 현재 년월일 시분초 구하기, 한국식 시간 문자열; YYYY-MM-DD hh:mm:ss 
43.현재 시간으로 된 파일명 만들기 BAT 배치 파일; Time To File Name 
44.XCOPY.EXE 프로그램/명령어 다운로드(Download) 받는 곳은? : 크로스 카피/엑스 카피 
45.오늘 날짜로 된 디렉토리명, 폴더명 만들기 BAT 배치 파일; Date To Directory Name 
46.CMD 아스키 코드표 보기; 도스창에서 아스키코드(ASCII Code) 출력하는 법, 명령 
47.날짜 BAT, 현재 시간 출력 배치파일; Batch File 
48.윈도우용 wget.exe 사용법; 명령행 다운로드 프로그램; wget Command for MS-Windows 
49.도스(DOS)용 RAR 로 압축하기, 파일 압축 풀기; 텍스트 모드 압축 
50.도스용 윈집(WinZip) 실행 배치 파일; DOS WZZIP-WZUNZIP Batch File 
51.도스(DOS)에서, ZIP 파일 압축하기, 압축 풀기 프로그램, 옵션; Add Extract Zip File 
52.도스용 ZIP 프로그램; DOS윈집 다운로드,사용법; WinZip Command Line Support Add-On 
53.배치 파일 실행 결과 보기 명령어; Batch File Result View Command 
54.[배치 파일] 여러 파일 이름 한꺼번에 바꾸기; 파일명 일괄 변경; Batch File Rename 
55.배치 파일 안에서, EXE 파일 실행 법; Batch File에서 실행파일 호출 
56.CMD 확장자 파일 만들기, CMD.EXE로, 파일(File) 만들기/저장(Save)하기
57.[QnA] 2개 이상의 도스 명령어를 한꺼번에 실행하는 법은? 
58.배치 파일에서, PC스피커로, 비프음(Beep; 삑 하는 소리) 내기 
59.배치 파일의 옵션을 해석하여 조건문 만들기 예제: 도움말(Help) 옵션 넣기 
60.도스(DOS, CMD)창, 영문 Code Page (코드 페이지)로 변경하는 명령어: CHCP 
61.RAR 도스 창(DOS)/명령프롬프트/텍스트 모드; WinRAR(윈라) 콘솔 버전; RAR.EXE 
62.엔터 키/줄바꿈/개행문자 넣기; Batch File Enter Key 
63.도스(DOS)에서, Program Files 폴더 지정/입력하는 법은? 
64.[윈도우] 시스템 파일 복사하는 명령어. 히든파일 카피 명령; Copy Command, System Hidden File 
65.도스(DOS)에서, 연월일(년월일)/시분초, 현재 날짜 구하기; get Date Time 
66.도스로 빠져 나가기, 윈도우에서 도스로; How To Exit To DOS 
67.[배치파일] 랜덤 숫자 발생, 1~10 난수 생성; Random Number Batch File 
68.[배치파일] 요일 출력, 오늘 현재 요일만 구하기; Get DAY OF THE WEEK String 
69.[배치파일] 요일 삭제, 날짜 문자열에서 요일 지우기; Remove DAY OF THE WEEK from Date String 
70.[배치파일/Batch File] args / argc, argv 파라미터(인수; 매개변수) 사용 방법; DOS BAT 
71.도스박스/도스창 전체 화면 모드 핫키; DOSBox, DOS Full-Screen Hot Key 
72.배치파일 텍스트 출력 방법. 글자,문자열 쓰기, 프린트 함수; Batch File Print String 
73.배치파일 예약어, 키워드 목록; Batch File Keyword List 
74.현재 디렉토리 환경변수, Current Directory (CWD) Environment Variable 
75.윈도우 SORT 명령, 숫자 크기순 정렬(소팅) 문제 해결, Perl(펄)로 
76.환경변수 저장 하는 법; 윈도우2000 / XP 환경 변수 저장법; Set Environment Variable 
77.윈도우에서 파이썬(python.exe) 실행 배치파일; PYTHON.BAT 
78.탐색기 폴더에서, 도스창 실행 레지스트리: '여기에 명령 프롬프트' Command Line Here Registry 
79.[윈도우] 텍스트 파일 합치기 명령어; Text File (.TXT) 문서 병합 방법; TXT Merge DOS 
80.[배치파일] 윈도우 환경변수를 echo 로 출력 하는 법; PRINT Environment Variable DOS 
81.[배치파일] %1 %2 %3 퍼센트 일,이,삼 기호의 의미; DOS BAT Argument 
82.도스용 V3.EXE 실행 배치파일; 도스창에서 백신III 실행 DOS BAT 
83.윈도우] BAT 파일 실행 하는 법; MS-DOS 배치 파일 실행법 
84.IF ELSE 문 사용법 예제; 도스 BAT 강좌 
85.배치파일(.BAT) IF 조건문 사용법 기초 강좌; DOS Batch File IF 
86.Java/자바] 소스 컴파일 + 실행하기, 자동 배치파일(BAT) 
87.배치파일(.BAT)로, 파일 출력, 텍스트 파일(Text File) 만드는 방법 
88.[배치파일] 옵션 문자열 얻기, 실행시 매개변수 활용 DOS-NT Batch File Option 
89.[배치파일] 사용자 문자열 입력받기, 입력을 변수에 저장: DOS-NT Batch File Input String 
90.[DOS/도스창/배치파일] 파일 복사 명령어 사용법: File Copy Command 
91.[도스 도스창] 텍스트 파일 읽기 명령어, 보기 명령; DOS Text File View Command 
92.윈도우 환경변수 복사하여 파일로 저장/만들기: Windows Environment Variable To File 
93.배치파일, 도스(DOS)에서 파일 삭제, 디렉토리 지우기 명령어; Delete File 
94.[배치 파일] 변수에 현재 시간/날짜 넣기; 날짜/시간 출력, DATE TIME DOS BATCH 
95.이진파일을 텍스트파일로 변환, 바이너리를 아스키로, Convert Binary File to Text File 
96.도스/도스창(cmd.exe)용 실행파일/명령어 만드는, 언어/프로그램은? Creating New Commands
97.반복되는 명령 실행: 윈도우 도스창 / 리눅스 - Repeat Commands 
98.하위 디렉토리까지 복사, Copy 디렉토리: XCOPY, DOS 배치 파일 
99.파일 찾기 명령, 도스창에서 디렉토리 찾기, File Find Command 
100.경로(Path) 알아내기/ 패스 문자열 얻어 오기: DOS 배치 파일 
101.현재 폴더, 현재 디렉토리 의미하는 특수 문자] DOS Batch File, Current Directory 
102.도스 화면에, 글자 출력(프린트) 명령어는? - DOS Bat Print String 
103.FOR문으로, 텍스트 파일 행 처리 - 도스 DOS Bat File 강좌 
104.FOR 문 예제. for in do 사용법 - 도스 DOS Bat File 강좌 
105.도스창 닫기 명령 / 명령프롬프트창 종료 명령어 - .BAT DOS Batch File 
106.윈도우 도스창에서 정규식 사용법 - Windows XP regex FINDSTR 
107.SORT 명령 사용법, 문자열/텍스트파일 정렬(소팅)하기 - Windows XP 
108.배치파일] 탈출코드(에러레벨;반환값) 강제로 설정하기 - ERRORLEVEL, Exit Code, Batch File
109.[QnA] 도스창에서, 파일 이름의 빈 칸은 어떻게 입력합니까? - LFN, Long File Name 
110.도스창 실행 / 도스 프롬프트 있는 곳 - Windows DOS Prompt 
111.BAT파일 안에서, 다른 BAT파일 실행/호출 - Batch File - 일괄 파일 
112.기존의 패스(Path) 환경변수에, 새 경로(디렉토리; 폴더) 추가하는 법 
113.도스창(명령프롬프트창) 제목줄(타이틀) 변경하는 도스 명령 - TITLE 
114.배치파일에서, 문자열 비교 판단 / 문자열이 동일한지 다른지 - Compare Strings in Batch File 
115.도스(DOS) 배치파일 명령어 목록 
116.도스 화면, 잠시 정지시키는 키는? 도스창 스크롤 일시 중지시키는 키는? - DOS Pause Break Key 
117.디스크 라벨(볼륨 레이블) 변경하는 법 - LABEL - VOL 
118.'환경변수'란 무엇인가요? 환경변수 변경/추가/삭제하는 법은? - Environment Variable 
119.화면 출력 일시 정지시키는 명령어는? 도스창(윈도우 명령프롬프트)/배치파일에서 - pause 
120.화면 글자 모두 지우는 명령어는? 도스창(윈도 명령프롬프트)/배치파일에서 - cls 
121.도스 명령에서, 백슬래쉬(\, ₩)와 슬래쉬(/) 차이점은? - 리눅스에서는? - Back Slash [QnA] 
122.[grep.exe] 유닉스/리눅스의 grep 을 윈도우에서 사용하기: 문자열 찾기 
123.도스창 한글/영문으로 변경 방법: 명령 프롬프트 코드 페이지 전환 - CHCP, Code Page 
124.배치 파일에서의 변수 사용 [배치 파일 작성법] - DOS Batch Variable 
125.배치파일 종료시 변수 자동으로 지우기, 변수 충돌 방지, 변수 지역화: SETLOCAL / ENDLOCAL 
126.[배치 파일] 윈도의 .cmd 확장자를 가진 파일에 대해 
127.[배치 파일 팁] echo문 행갈이 / 빈 줄 넣기/ 한 줄 띄어쓰기: Batch File Tip 
128.[윈도우2000/XP] 탭(Tab)키로, 파일명 자동완성 - 명령 프롬프트 - File/Directory Name Auto-Completion 
129.[배치 파일] '컴퓨터 이름' 알아내기 / 출력하기: Get Computer Name 
130.윈도우 XP에서, 도스로 가려면? 도스창이 있는 곳은? [QnA] 
131.[윈도우용 grep] find 보다 더 강력한 findstr 명령 
132.[윈도우] 공백이 들어간 폴더명/파일명의 파일 실행하기 - Windows 
133.배치 파일(Batch File), 주석문/주석 처리 방법; 코멘트,설명 문 달기; Comment 
134.[배치 파일] 프로그램 실행의 성공 여부를 Error Level 로 확인/판단하기: ERRORLEVEL 
135.[리눅스/Cygwin] 프로그램 실행이 안돼요. 배치 파일(Batch File) 실행법은? 
136.[QnA] 도스창이 그냥 닫혀 버립니다. 안 닫히게 하는 법은? pause 명령으로, 화면 정시키기 
137.도스창 화면 저장 / 명령프롬프트(콘솔 창) 결과를 파일로 저장하는 방법 
138.command.com / cmd.exe 에 내장되어 있지 않아 별도의 파일이 있어야 실행되는 명령어는? 
139.[배치파일 강좌] 배치파일 만드는 법 / .BAT 파일; 일괄 파일(Batch File)이란? 
140.[배치파일 강좌] GOTO 명령 / 라벨(레이블; Label)에 대해서 
141.윈도우 도스창에서의, 파일 비교 명령은? ; 텍스트 파일 / 이진 파일 비교 
142.도스(DOS) 환경변수 보기 [컴퓨터 초보자를 위한 강좌] 
143.echo 명령에서, 쌍따옴표, 꺾은 괄호(부등호) 등 특수문자 표현하기 
144.배치 파일 (Batch File) 실행시에, 인수(파라미터; 옵션; 매개변수) 주기 
145.도스(DOS)/윈도우의, 배치 파일에서 echo off 란? 
146.모든 '도스 명령' 목록 보기, 윈도우2000 윈도우XP 에서 
147.자신의 IP주소(아이피 주소; IP Address) 손쉽게 알아보기


출처: http://yong40.tistory.com/112





'System > Windows' 카테고리의 다른 글

windows7 linux multi booting  (0) 2012.12.27
batch에서 현재 경로 확인  (0) 2012.12.22
batch 명령어  (0) 2012.12.22
window - TASKKILL(process kill)  (0) 2012.12.22
java - windows dos 명령어, exe 및 bat 파일 실행  (0) 2012.12.21
Posted by linuxism
,


TASKKILL [/S 시스템 [/U 사용자 이름 [/P [암호]]]] 

         { [/FI 필터] [/PID 프로세스 id | /IM 이미지 이름] } [/F] [/T]

설명: 

    이 명령줄 도구는 하나 이상의 프로세스를 종료하기 위해 사용할 수 있습 

    프로세스 id 또는 이미지 이름으로 프로세스를 종료할 수 있습니다.

매개 변수 목록: 

    /S    시스템           연결할 원격 시스템을 지정합니다.

    /U    [domain\]user    명령을 실행해야 하는 사용자 

                           컨텍스트를 지정합니다.

    /P    [암호]           해당 사용자 컨텍스트의 암호를 지정합니다. 

                           생략한 경우에는 물어봅니다.

    /F                     프로세스를 강제로 종료하도록 

                           지정합니다.

    /FI   필터             필터에서 지정한 조건과 일치하는 

                           작업 집합을 표시합니다.

    /PID  프로세스 id      종료해야 하는 프로세스의 PID를 

                           지정합니다.

    /IM   이미지 이름      종료해야 하는 프로세스의 이미지 이름을 

                           지정합니다. 와일드 카드 문자 '*'를 사용하여 

                           모든 이미지 이름을 지정할 수 있습니다.

    /T                     트리 종료: 지정된 프로세스와 그 프로세스로부터 시작된 

                           모든 자식 프로세스를 종료합니다.

    /?                     이 도움말/사용법을 표시합니다.

필터: 

    필터 이름   유효한 연산자           유효한 값 

    -----------   ---------------           -------------- 

    STATUS        eq, ne                    RUNNING | NOT RESPONDING 

    IMAGENAME     eq, ne                    이미지 이름 

    PID           eq, ne, gt, lt, ge, le    PID 값 

    SESSION       eq, ne, gt, lt, ge, le    세션 번호. 

    CPUTIME       eq, ne, gt, lt, ge, le    CPU 시간 형식 

                                            hh:mm:ss 

                                            hh - 시간, 

                                            mm - 분, ss - 초 

    MEMUSAGE      eq, ne, gt, lt, ge, le    메모리 사용(KB) 

    USERNAME      eq, ne                    사용자 이름([domain\]user 

                                            형식) 

    MODULES       eq, ne                    DLL 이름 

    SERVICES      eq, ne                    서비스 이름 

    WINDOWTITLE   eq, ne                    창 제목

참고: /IM 스위치에 대한 와일드 카드 문자 '*'는 필터에서만 사용할 수 있습

참고: 원격 프로세스의 종료는 /F 옵션 지정 여부와 상관없이 

      항상 강제적으로 수행됩니다.

예: 

    TASKKILL /S 시스템 /F /IM notepad.exe /T 

    TASKKILL /PID 1230 /PID 1241 /PID 1253 /T 

    TASKKILL /F /IM notepad.exe /IM mspaint.exe 

    TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*" 

    TASKKILL /F /FI "USERNAME eq NT AUTHORITY\SYSTEM" /IM notepad.exe 

    TASKKILL /S 시스템 /U domain\username /FI "USERNAME ne NT*" /IM * 

    TASKKILL /S 시스템 /U 사용자 이름 /P 암호 /FI "IMAGENAME eq note*"






뭐...요즘 TCPVIEW라던지 기타 툴들이 많이 나왔지만 인터넷도 안되고

마땅히 툴도 없을 경우 아래와 같은 명령어와 작업을 통해 프로세스 확인이

가능하다.

 

1. 윈도우 커맨드 창을 띄워 다음을 입력

 

   netstat -ano 1 | find "ESTABLISH"

 

   뭐 기타 응용은 가능하다.

   포트로 찾고 싶을때는 netstat -ano 1 | find "8080"

   IP로도 찾고 싶을때는 netstat -ano 1 | find "8080" | find "10.10.10.10" 등등

   혹 output을 파일로 저장하고 싶으면 netstat -ano 1 | find "ESTABLISH" > output.log

   참 옵션뒤에 '1'을 붙이는 이유는 netstat라는 넘이 현재의 상태만을 보여주고 바로 끝내기

   때문에 1초 간격으로 계속 실행하라는 옵션이다.

   즉, 해당 옵션을 걸어 한 1분이상 모니터링을 하다보면 원하는 값을 얻을 수 있지 않을까 싶다.

 

2. 윈도우 작업관리자를 실행시킨후 '보기' -> '열선택' 중 PID을 check 해준다.

   그럼 프로세스 항목에 '이미지이름'에  'PID'가 표시되게 된다.

 

3. 자....이젠 아까 1번항에서 확인했던 output의 확인하고 싶었던 PID를 작업관리자의 PID와

    비교 하고 이상한 프로세스라면 종료 시키거나 지워버리면 될것이다...


출처 - http://blog.daum.net/_blog/BlogTypeView.do?blogid=0Af9k&articleno=8213826&categoryId=188547&regdt=20061206090746#ajax_history_home





'System > Windows' 카테고리의 다른 글

windows7 linux multi booting  (0) 2012.12.27
batch에서 현재 경로 확인  (0) 2012.12.22
batch 명령어  (0) 2012.12.22
batch 명령어 모음  (0) 2012.12.22
java - windows dos 명령어, exe 및 bat 파일 실행  (0) 2012.12.21
Posted by linuxism
,


자바에서 배치파일(.batch)뿐만 아니라 DOS 커맨드, 실행파일(.exe) 파일도 실행 가능하다

 

1. java에서 배치파일 실행하기 (DOS 명령어, exe 실행파일)

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class ManucalDBBackup{
  try {
    Process p =Runtime.getRuntime().exec("C:\\Tomcat 5.5\\webapps\\TEST.bat");
    
    BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line = null;
    
    while ((line = br.readLine()) != null) {
      System.out.println(line);
    }
  } catch (Exception e) {
    System.err.println(e);
  }
}

 

자바소스를 실행하면, 일반 명령어나 배치파일의 실행결과가 consol에 뿌려지면서 실행이 된다.ㅋ

 

2. java에서 ORACLE DB 백업(exp 명령어) 실행하기

[오라클 DB 백업 배치파일 내용]
  @echo off
  d:
  cd D:\BackUp\aBisManager\backupDB
  setlocal
  set date2=%date:-=%
  set time2=%time: =0%
  set time3=%time2:~0,2%%time2:~3,2%%time:~6,2%
  set DS=%date2%_%time3%
  mkdir %DS%
  exp userid=userid/userpwd file='D:\BackUp\%DS%\TEST.dmp'

        log='D:\BackUp\%DS%\TEST.log' tables=(userid.xx, userid.yy) statistics=none
  endlocal
  @echo on

 

로컬에서..

오라클 백업 명령 배치파일을 그냥 실행하면 되는데

웹상(was : 톰캣)에서..
java를 통해 호출하면 계속 hang이 걸려버린다.. -ㅇ-;;
이 상태에서 톰캣을 꺼버리면 바로 백업이 완료되는 시츄에이션이 계속 되고..
톰캣을 안 끄고
걍 시간을 두고 보니 약 한시간 반 뒤에 백업파일이 생성되는 황당함ㅋ
이유가 무엇일까?
많은 국내 사이트를 돌아다녀봤는데.. 모두들 비슷한 문제를 겪고 있었다.
모두들 엉뚱한 소리만 하고,,
눈을 돌려.. 해외로~
해외에도 동일한 문제로 고민을 하는 많은 사람들.
... 하지만 해답을 제시하는 사람 몇몇 발견!!!


찾았다~!! ㅠㅠ


원인은 exp 명령어가 실행되면 output을 만들게 되는데 이를 (표준)출력 해주지 않으면 버퍼에 가득차 버려서 버퍼가 비워지길 기다리게 되면서 hang상태가 되는 것.


결론은 java에서 exp배치파일을 실행하면서 동시에 thread를 이용하여 표준출력을 해주는 것

 


소스 :

http://www.objects.com.au/java/examples/io/examples/ConsoleExecExample.java

http://www.objects.com.au/java/examples/io/AutoReader.java

 


출처 - http://blog.daum.net/nsh777/5494230






CmdExecutor.java


출처 - http://blog.daum.net/istae0430/246






아시다시피 위 함수는 process 를 실행시키기 위한 것입니다.
그런데 만약 프로세스의 수행이 끝이 날때까지 기다려야 한다면 어떻게 할까요?

일반적으로 아래와 같이 waitFor() 를 호출해 줍니다.

1
2
Process process = Runtime.getRuntime().exec(cmd);
process.waitFor(); 


문제는 waitFor() 가 영원히 끝나지 않는 경우가 발생한다는 것입니다.
분명히 cmd 에 해당하는 프로세스가 종료되어야 하는데, 이상하게도 끝나지 않는다는 이야깁니다.

원인은 stream 의 버퍼가 비워지지 않았기 때문입니다.
이를 비워줌으로써 문제를 해결할 수 있습니다.

그럼 어떻게 비워주면 될까요?
waitFor() 함수를 호출하는 순간, Thread 는 process 가 종료될때까지 block 이 됩니다.
다시 말해서 해당 stream 을 비워주는 작업을 별도의 thread 에서 수행해야 한다는 이야기죠.

별도 Thread 를 만들고, 이 Thread 에서 process.getErrorStream();  process.getInputStream(); 를 통해 Stream 을 얻어온 뒤, 계속해서 read 해 줌으로써 스트림을 비워야 한다는 것입니다.

만약, process 수행결과 얻어지는 출력을 필요로 하지 않는다면 코드는 훨씬 간단해 집니다.
아래처럼 애초에 stream 을 close 해 버리면 되거든요. :)

1
2
3
4
5
Process process = Runtime.getRuntime().exec(cmd);
process.getErrorStream().close();
process.getInputStream().close();
process.getOutputStream().close();
process.waitFor(); 


문제없이 process 가 실행 후, waitFor() 에서 빠져가나는 것을 확인하실 수 있습니다.


출처 - http://crystalcube.co.kr/69






자바에서 Runtime.getRuntime().exec() 를 사용하여 windows 명령어를 실행하는 방법.

여기서 command는 실행 명령어 이다.

예 : move c:\data\source.txt c:\data\target.txt  <- 윈도우용 

예 : mv /data/source.txt /data/target.txt <- 리눅스용


Process process;
String osName = System.getProperty("os.name");
String[] cmd;

if(osName.toLowerCase().startsWith("window")) {
    cmd = new String[] { "cmd.exe", "/y", "/c", command };
} else {
    cmd = new String[] { "/bin/sh", "-c", command };
}

process = Runtime.getRuntime().exec(cmd);

return process.waitFor();



출처 - http://blog.daum.net/lkflower/17224498








시스템 명령어 테스트 샘플 소스


------------------------------------------------------------------------

import java.io.*;


public class Test

{

public static void main ( String [] args ) throws IOException, InterruptedException

{

String servlet_path = "C:\resin1.2.3\doc\WEB-INF\classes";

String sourceDir = System.getProperty ( "user.dir" ) + File.separator + "source" + File.separator + "*.java";

String comstr = "javac -d " + servlet_path + " " + sourceDir;

Process proc = Runtime.getRuntime ( ).exec ( comstr );

proc.waitFor ( );

//주의: 윈도우의 경우 servlet_path는 구분문자가 \ 인데, sourceDir는 로 나온다.

//배열을 안쓰고 문자열로 직접하는게 잘될 때가 있다.

}

}

------------------------------------------------------------------------

import java.io.*;


public class Test

{

public static void main ( String [] args )

{

try

{

String comstr = "chmod 777 test.txt";

String [] command = { "/bin/bsh", "-c", comstr };


Process proc = Runtime.getRuntime ().exec ( command );

proc.waitFor ( );


if ( proc.exitValue ( ) != 0 )

out.println ( "에러..." );


proc.destroy ( );

}

catch ( Exception e ) { System.out.println ( e ); }

}

}

------------------------------------------------------------------------

import java.io.*;


public class Test

{

public static void main ( String [] args )

{

try

{

String comstr = "ls -l";

String [] command = { "/bin/bsh", "-c", comstr }; //리눅스에서

//String [] command = { "/bin/csh", "-c", comstr }; // Unix에서

//String [] command = { "command.com", "/c", comstr }; // 윈도우에서


Process proc = Runtime.getRuntime ( ).exec ( command );

proc.waitFor ( );


if ( proc.exitValue ( ) != 0 )

{

BufferedReader err = new BufferedReader ( new InputStreamReader ( proc.getErrorStream ( ) ) );

while ( err.ready ( ) )

System.out.println ( err.readLine ( ) );

err.close ( );

}

else

{

BufferedReader out = new BufferedReader ( new InputStreamReader ( proc.getInputStream ( ) ) );

while ( out.ready ( ) )

System.out.println ( out.readLine ( ) );

out.close ( );

}


proc.destroy ( );

}

catch ( Exception e ) { System.out.println ( e ); }

}

}

------------------------------------------------------------------------


2. 리눅스 시스템 명령어 실행 결과를 받아오기

------------------------------------------------------------------------

String command = "ls";

String data = null;

StringBuffer strbuf = new StringBuffer ( );

BufferedReader br = null;

try

{ Process proc = Runtime.getRuntime ( ).exec ( command );

br = new BufferedReader ( new InputStreamReader ( proc.getInputStream ( ) ) );

String line;

while ( ( line = br.readLine ( ) ) != null )

strbuf.append ( line + " " );

br.close ( );

}

catch ( Exception e ) { out.println ( e ); }

data = strbuf.toString ( );

------------------------------------------------------------------------


3. 상호작용(interactive) 명령어의 실행


프로세스의 표준 출력을 자바 프로그램에서는 p.getInputStream 메소드를 이용하여 얻고,

p.getOutputStream 메소드를 이용하여 프로세스의 표준 입력 장치에 쓰게 됩니다.

이 때, 한 가지 주의할 사항은 표준 출력 스트림에 대답을 쓴(write) 후, 꼭 flush 또는 close 메소드를 이용하여

표준 출력 스트림을 비워(flush) 주어야 합니다.

------------------------------------------------------------------------

import java.io.*;


public class InteractiveProcessTest

{

public static void main ( String [] args)

{

// 반드시 배열로 해야한다. 문자열로 하면 단지 전체를 하나의 프로그램으로 인식한다.

String [] command = { "ping", "203.252.134.126" };

try

{

Process p = Runtime.getRuntime ( ).exec ( command );

byte [] msg = new byte [128];

int len;


while ( ( len = p.getInputStream ().read ( msg ) ) > 0 )

System.out.print ( new String( msg, 0, len ) );


String rs = " ";

byte [] rb = new byte [] { (byte)' ' } ; //rs.getBytes();

OutputStream os = p.getOutputStream ( );

os.write ( rb );

os.close ( );

}

catch ( Exception e ) { e.printStackTrace ( ); }

}

}

------------------------------------------------------------------------

결과 :

C:>java InteractiveProcessTest

Pinging 203.252.134.126 with 32 bytes of data:

Reply from 203.252.134.126: bytes=32 time<10ms TTL=128

Reply from 203.252.134.126: bytes=32 time<10ms TTL=128


4. 명령어 문자열의 안정적인 작성 예

------------------------------------------------------------------------

// Unix에서

String [] command = { "/bin/csh", "-c", "finger | grep -v 639" };

// 윈도우에서

String [] command = { "command.com", "/c", "finger | grep -v 639" };


//getInputStream ( ) 스트림으로 결과값을 받아올 때 형변환해서 받을 수 없다.

String data = "";

BufferedReader out = new BufferedReader ( new InputStreamReader ( proc.getInputStream ( ) ) );

data = out.readLine ( ); //int count = Integer.parseInt ( out.readLine ( ) );는 안된다.

out.close ( );

int count = Integer.parseInt ( data );

------------------------------------------------------------------------


5. 프로세스 함수들


5.1 프로세스의 생성 및 종료

------------------------------------------------------------------------

- “Runtime runtime = Runtime.getRuntime();”: 런타임 객체를 생성합니다.

- “Process p = runtime.exec(“프로그램경로명”);”: exec 메소드를 이용하여 프로세스를 생성합니다.

- “p.waitFor();”: 자식 프로세스가 종료될 때까지 기다립니다.

- “p.destroy();”: 부모 프로세스에서 자식 프로세스를 강제로 종료시킵니다.

- “System.exit(0);”: 부모 프로세스만 종료되고 자식 프로세스는 계속 실행됩니다.

------------------------------------------------------------------------


5.2 Runtime 클래스가 제공해 주는 주요 메소드

------------------------------------------------------------------------

- public static Runtime getRuntime(): 현재 실행되고 있는 자바 애플리케이션과 관련된 런타임 객체를 리턴해 줍니다.

- public void exit(int status): 현재 자바 가상머신을 종료합니다. status 매개변수는 종료시의 상태값을 나타내며,

일반적으로 0 이외의 값은 비정상적으로 종료되었음을 의미합니다.

- public Process exec(String command) throws IOException: 주어진 명령어를 독립된 프로세스로 실행시켜 줍니다.

exec(command, null)와 같이 실행시킨 것과 같습니다.

- public Process exec(String command, String envp[]) throws IOException:

주어진 명령어를 주어진 환경을 갖는 독립된 프로세스로 실행시켜 줍니다.

이 메소드는 명령어 문자열을 토큰으로 나누어 이 토큰들을 포함하고 있는 cmdarray라는 새로운 배열을 생성합니다.

그리고 나서 exec(cmdarray, envp)을 호출합니다.

- public Process exec(String cmdarray[]) throws IOException:

주어진 문자열 배열에 있는 명령어와 매개변수를 이용하여 독립된 프로세스로 실행시켜 줍니다.

exec(cmdarray, null)을 호출합니다.

- public Process exec(String cmdarray[], String envp[]) throws IOException:

주어진 문자열 배열에 있는 명령어와 매개변수를 이용하여 주어진 환경을 갖는 독립된 프로세스로 실행시켜 줍니다.

문자열 배열 cmdarray에는 명령어와 명령행 인자들을 나타내고 있습니다.

- public native long freeMemory(): 시스템에 남아있는 메모리의 양을 얻습니다.

이 값은 항상 totalMemory() 메소드에 의해 얻어지는 값보다 작습니다.

- public native long totalMemory(): 자바 가상머신의 최대 메모리 크기를 얻습니다.

------------------------------------------------------------------------


5.3 Process 클래스가 제공해 주는 주요 메소드

------------------------------------------------------------------------

- public abstract OutputStream getOutputStream(): 자식 프로세스의 출력 스트림을 얻습니다.

- public abstract InputStream getInputStream(): 자식 프로세스의 입력 스트림을 얻습니다.

- public abstract InputStream getErrorStream(): 자식 프로세스의 에러 스트림을 얻습니다.

- public abstract int waitFor() throws InterruptedException: 자식 프로세스가 종료될 때까지 기다립니다.

- public abstract int exitValue(): 자식 프로세스가 종료할 때의 상태값을 얻습니다.

- public abstract void destroy(): 자식 프로세스를 강제로 종료시킵니다.

------------------------------------------------------------------------


6. 메모리 관리

------------------------------------------------------------------------

public long totalMemory ( ) : 현재 할당받은 총 시스템 메모리 바이트 갯수.

public long freeMemory ( ) : 현재 남아 있는 자유 메모리 바이트 갯수(근사치).


Runtime rt = Runtime.getRuntime ( );

System.out.println ( rt.totalMemory ( ) );

System.out.println ( rt.freeMemory ( ) );

------------------------------------------------------------------------



나. 시스템 정보


static PrintStream err - The "standard" error output stream.

static InputStream in - The "standard" input stream.

static PrintStream out - The "standard" output stream.


static void arraycopy (Object src, int src_position, Object dst, int dst_position, int length)

static long currentTimeMillis () - Returns the current time in milliseconds.

static void exit (int status) - Terminates the currently running Java Virtual Machine.

static void gc () - Runs the garbage collector.

static String getenv (String name) - Deprecated from getProperty method


static Properties getProperties() - Determines the current system properties.

static String getProperty(String key) - Gets the system property indicated by the specified key.

static String getProperty(String key, String def) - Gets the system property indicated by the specified key.

static SecurityManager getSecurityManager() - Gets the system security interface.

static int identityHashCode(Object x) - Returns the same hashcode for the given object as would be returned by the default method hashCode(), whether or not the given object's class overrides hashCode().

static void load(String filename) - Loads a code file with the specified filename from the local file system as a dynamic library.

static void loadLibrary(String libname) - Loads the system library specified by the libname argument.

static String mapLibraryName(String libname) - Maps a library name into a platform-specific string representing a native library.

static void runFinalization() - Runs the finalization methods of any objects pending finalization.

static void runFinalizersOnExit(boolean value) - Deprecated. This method is inherently unsafe. It may result in finalizers being called on live objects while other threads are concurrently manipulating those objects, resulting in erratic behavior or deadlock.

static void setErr(PrintStream err) - Reassigns the "standard" error output stream.

static void setIn(InputStream in) - Reassigns the "standard" input stream.

static void setOut(PrintStream out) - Reassigns the "standard" output stream.

static void setProperties(Properties props) - Sets the system properties to the Properties argument.

static String setProperty(String key, String value) - Sets the system property indicated by the specified key.

static void setSecurityManager(SecurityManager s)


String System.getProperty ( String key ): key에 해당하는 시스템정보를 가져온다.

String System.setProperty ( String key, String value )

Properties System.getProperties ( ): 시스템 정보를 몽땅 갖고 온다.

System.setProperties ( Properties props )


사용법

------------------------------------------------------------------------

String currentDirectory = System.getProperty ( "user.dir" );

------------------------------------------------------------------------


Key값

------------------------------------------------------------------------

// 일반적으로, 보안에 걸리지 않는 표준 시스템 프로퍼티

"java.version", // 자바의 버전 ( "1.0.2", "1.1", "1.1.3", "1.2", ...)

"java.class.version", // 자바 클래스 화일 포맷 버전

"java.vendor", // 자바 가상 머쉰 판매 회사

"java.vendor.url", // 자바 가상 머쉰 판매 회사의 URL

"os.name", // 운영체제 이름 ( "Windows 95", "Windows NT", "MacOS",

// "Linux", "Solaris", "OS/2", "OSF1", ... )

"os.version", // 운영체제 버전

"os.arch", // 컴퓨터 기종 ( "x86", "sparc", ... )

"line.separator", // 시스템에서의 행 분리 문자열 ( "

", " ", " " )

"file.separator", // 화일 경로 이름내의 디렉토리 구분 문자 ("", "/")

"path.separator", // 화일 경로 이름 리스트의 구분 문자 (";", ":")


// 일반적으로, 보안에 의한 접근 제한을 받는 표준 시스템 프로퍼티 (애플릿의 경우)

"java.home", // JDK 설치 디렉토리

"java.class.path", // 패키지가 있는 디렉토리 리스트

// (일반적으로, CLASSPATH 환경변수값에 의해 영향 받음)

"user.name", // 사용자의 등록 이름

"user.home", // 사용자의 홈 디렉토리

"user.dir", // 사용자의 현재 작업 디렉토리(파일을 뺀 전체 경로)


// JDK 1.1에서 비공식적으로 추가된 지역 정보 시스템 프로퍼티

// 일반적으로, 보안에 의한 접근 제한을 받음 (애플릿의 경우)

"file.encoding", // 사용자의 디폴트 문자 인코딩 이름

"user.language", // 사용자의 언어

"user.region", // 사용자의 거주 지역 (보통, 국가)

"user.timezone", // 사용자 지역의 표준 시간대 이름


// 웹 브라우저 정보 비표준 시스템 프로퍼티

"browser", // 웹 브라우저 이름

"browser.version", // 웹 브라우저 버전

"browser.vendor", // 웹 브라우저 회사

------------------------------------------------------------------------



다. 기타


//아래는 자바서비스넷의 이원영님 자료

-----------------------------------------------------------------------------------

import java.io.*;


public class Test

{

public static void main(String[] args) throws Exception

{

Runtime rt = Runtime.getRuntime();

StringBuffer cmd = new StringBuffer();

for(int i=0;i cmd.append(args[i] + " ");


Process p = rt.exec(cmd.toString() );

PrintWriter keyboard = new PrintWriter(p.getOutputStream());

//keyboard.println( ... );


p.waitFor(); // wait for process finishing.


BufferedReader out = new BufferedReader(new InputStreamReader(p.getInputStream()));

while ( out.ready() )

System.out.println(out.readLine());


BufferedReader err = new BufferedReader(new InputStreamReader(p.getErrorStream()));

while ( err.ready() )

System.out.println(err.readLine());


p.destroy(); //confirm

}

}

-----------------------------------------------------------------------------------

javaservice:/home/java/tmp$ javac Test.java

javaservice:/home/java/tmp$ java Test ls -alF /var


그러나 windows환경의 command.com의 경우, "command.com /c dir" 등의 방법으로

될 것으로 예상됐지만, "command.com /c dir" 의 명령이 보통의 DOS창에선 바로 exit으로

이어지나, Runtime.exec("command.com /c dir") 로 호출했을 경우, Process Thread가

끝나질 않는 군요... 결국, p.waitFor()에서 blocking 현상이 일어나네요.

어쨌거나 Unix환경에선 잘 되네요.


//아래는 이원영의 참고자료

-----------------------------------------------------------------------------------

String[] command = {"a.exe"};

Process p = Runtime.getRuntime().exec(command);


OutputStream os = p.getOutputStream();

DataOutputStream dos = new DataOutputStream(os);

dos.writeInt(...);

dos.flush();

os.close();


p.waitFor();


int rc = p.exitValue();

System.out.println("return code: "+ rc);

if(rc!=0)

{

InputStream errStream = p.getErrorStream();

DataInputStream errDataStream = new DataInputStream(errStream);

String s;

s = errDataStream.readLine();

while(s !=null)

{

System.out.println(s);

s = errDataStream.readLine();

}

}


InputStream is = p.getInputStream();

DataInputStream dis = new DataInputStream(is);


dis.readLine();

is.close();



출처 - http://alethe.egloos.com/1853800








'System > Windows' 카테고리의 다른 글

windows7 linux multi booting  (0) 2012.12.27
batch에서 현재 경로 확인  (0) 2012.12.22
batch 명령어  (0) 2012.12.22
batch 명령어 모음  (0) 2012.12.22
window - TASKKILL(process kill)  (0) 2012.12.22
Posted by linuxism
,