개발하는데 java 배치로 Windows Powershell을 파라미터 방식으로 호출할 일이 생겼다. 일단 powershell Script 코드는 다음과 같다.

 

1
2
echo 'TEST-1' $test
echo 'TEST-2' $userid
cs

대충 파라미터 두 개( test/userid)를 받아 echo로 찍어주는건데 기타 하위에는 물론 Azure Portal과의 통신이 있긴 하다. 근데 그게 중요한 것은 아니니까.

아무튼, java에서 파워쉘을 호출하는 소스코드는 다음과 같다.

 

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
//중략
 
final Runtime rt = Runtime.getRuntime();
 
//powershell.exe 명령어를 통해서, 해당 경로의 ps1 파일을 실행함
String commands = String.format("powershell.exe \"F:\\powershell.ps1  ");
 
Process proc = null;
String s = null;
 
// PowerShell 명령 시도 및 메시지 출력
try {
    proc = rt.exec(commands);
 
    BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream());
    while (( s = stdInput.readLine()) != null ) {
        System.out.println(s);
    }
 
    BufferedReader stdError = new BufferedReader(new InputStreamReader(proc.getErrorStream());
    while (( s = stdError.readLine()) != null ) {
        System.out.println(s);
    }
 
catch (IOException e) {
    e.printStacTrace();
 
}
 
//생략
cs

요기까지는 잘 했는데, 위의 powershell 코드와 같이 parameter를 넘기는 방법을 구글링해보아도 죄다 제각기 방법이 달라서, 츄라이를 해보니 다음과 같은 소스코드로 성공했다.

 

위의 java 소스에서 commands를 다음과 같은 방법으로 변경해주면 된다.

1
2
3
4
5
6
7
//중략
 
String[] arr = {"test_msg" , "test_user"}
//powershell.exe 명령어를 통해서, 해당 경로의 ps1 파일을 실행함
String commands = String.format("powershell.exe \"F:\\powershell.ps1  " + arr[0+ " " + arr[1]);
 
//생략
cs

PowerShell 코드는 다음과 같이 수정해주면 된다.

1
2
3
4
5
$test = $args[0]
$userid = $args[1]
 
echo 'TEST-1' $test
echo 'TEST-2' $userid
cs

java 에서 공백문자열로 구분된 string 값들이 args로 잘 매핑이 된다.

 

테스트를 해보니 해당 ps1(powershell)을 호출할 때 각 String 형태의 parameter(arguments)들을 넘길 때, 그냥 공백문자열로 구분하는 것으로 보인다. 실제로 여러방법으로 테스트 해보니 잘 되기도 하고. 이로써 java로 powershell script를 parameter 포함하여 execute 하는것에 성공했다. 앞으로 근데, 이러한 플젝을 몇번이나 할 지는 모르겠지만 말이다 =_=;;

 

 

java - how pass string array as a parameters to a powershell 

블로그 이미지

김생선

세상의 모든것을 어장관리

,
Starting Tomcat v5.5 Server at localhost' has encounterd a problem.

 

Server ports (8080, 8009) required by Tomcat v5.5 Server at localhost are already in use. The server may already be running in another process, or a system process may be using the port. To start this server you will need to stop the other process or change the port number(s).

 

어떠한 프로세스가 8080포트가 이미 사용중이기에 새로운 프로세스로 구동할 수 없다는 메시지이다.

 

이 메시지는 OS 상관없이 동일하며, 해당 포트를 사용중인 프로세스를 강제종료하거나 또는 위의 포트를 수정해서 구동하는 방법 등이 있다. 이는 현재 상태가 운영서버인지, 개발서버인지 또는 로컬개발환경인지에 따라 해결방법이 무궁무진하다.

 

대부분의 위의 오류메시지는 로컬개발환경임을 감안하고, 아래의 절차대로 수행한다.

 

1. Windows 기준 - 8080 포트를 사용중인 프로세스 확인

1-1. CMD 켜고 아래의 명령어 입력

> netstat -ano | findstr :8080
해당 명령어의 결과 중, 로컬 주소가 0.0.0.0:8080 인 항목의 PID를 확인한다

> taskkill /pid 1111 /f

/f 옵션은 강제종료를 의미한다.

 

2. Linux 기준 - 8080 포트를 사용중인 프로세스 확인

> netstat -ntlp | grep :8080
해당 명령어의 결과 중, PID 항목을 확인한다

> kill -9 PID

-9 옵션은 강제종료를 의미한다.

 

추가.

과거에 작성한 내용은 불확실한 정보가 너무나도 많아 아예 새로 작성하였다.

특히 SpringBoot를 주력으로 개발하다보니 Windows 상에서 포트충돌나는 일이 많아, 아예 cmd 명령어를 외우고 다닐 지경에 이르렀다. 부디 많은 개발자들에게 도움되었길 바란다.

블로그 이미지

김생선

세상의 모든것을 어장관리

,