Linux에서 Java 클래스를 올려 실행시키는 방법에 대한 정리를 하겠습니다. Java클래스를 실행하기 전에

Linux서버에 java파일을 올리는 것이 첫번째로 해야 합니다. 당연히 java 파일이 있어야 컴파일과 실행을 진행할 수 있습니다.
첫번째로 서버에 저장하는 방법을 확인해보겠습니다!


작성한 java 파일, jar를 서버에 저장하기

- FTP 클라이언트 소프트웨어 파일질라(FileZilla)를 이용하여 간편하게 서버에 접속하고 파일을 저장한다.

파일질라(FileZilla) : 오픈 소스 크로스 플랫폼의 자유 소프트웨어인 FTP 소프트웨어로
파일질라 클라이언트와 파일질라 서버로 구분되어 있다.

서버와 클라이언트의 파일 업/다운로드를 간편하게 할 수 있도록 도와준다. (다운로드 링크 https://filezilla-project.org/)


Linux에서 Java 실행 시키기

1. 패키지 선언이 선언이 된 java 파일을 컴파일하여 실행하기

간단하다. 올린 클래스 파일에 대해 linux 명령어로 컴파일을 하고 실행시킨다.


- java 파일 컴파일 하기

 [root@dev test]javac . HelloWorld.java

위 명령어는 현재 디렉토리에 HelloWorld.java 파일이 존제해야 실행 가능하다.
명령어에 존재하는 점(.)은 현재 디렉토리를 classpath로 지정하겠다는 의미이며
java 실행시 class 파일을 찾을 때 사용되는 경로(classpath)가 된다.

다음으로 java 명령어를 이용해 컴파일 된 class를 실행시키면 된다.

- 컴파일 된 class를 실행시키기

 [root@dev test] java HelloWorld.class

 

2. Jar 파일을 classpath에 추가한 후 컴파일하여 실행하기

먼저 Jar 파일이 무엇인지 확인해보자 

Jar = Java Archive(자바 아카이브)

여러개의 파일을 하나로 묶어서 실행할 수 있게 도와주며
jar로 만들었을 때 프로그램의 경로나 파일의 위치에 상관없이 실행이 가능한 .jar 형식의 파일이다.

1) 실행가능한 jar 파일 만들기

eclipse로 project java를 만들었다면 내부 Export 기능을 이용하여 더 편리하게 할 수 있으나
Linux내용 포스트이기 때문에 명령어로 정리해 작성해보자!!!!!

작성한 java 파일이 2개 이상이라면 먼저 실행되어야 하는 main() 함수가 어떤 class에 존재하는지 위치를 지정해야 한다.
위치에 대한 정보를 가지고 실행시 정보를 전달해주는 manifest.txt 파일을 먼저 생성한다.

두개의 예시 class로 확인해보자 ( ex-class : HelloWorldMain.class, HelloWorldSub.class )
예시는 HelloWorldMain.java, HelloWorldSub.java가 컴파일 된 상태에서 시작하니 위 1번을 참고한 후 진행한다.

- manifest.txt 파일 생성

[root@dev test] vim manifst.txt
>Main-Class :HelloWorldMain

이후 jar 명령어를 이용해 jar 파일을 생성한다.

- jar 파일 생성 example (Hello.jar 생성)

 [root@dev test] jar -cvmf manifest.txt Hello.jar *.class

 

Linux 서버 내에서 tomcat이 아닌 Java Application으로 만들어 Socket프로그램을 계속 돌릴 수 있게 하기 위해
Java Class 세개와 시작과 중지를 담당하는 두 개의 shell script를 만들게 되었습니다.

작업을 진행하면서 사용하게 된 Linux PID 얻기 관련 명령어를 정리해보겠습니다.

 


1. 프로세스 PID 확인하기

 ps -ef | grep com.socket.server.Server

현재 패키지(com.socket.server)에 클래스(Server)가 프로세스로 실행이 되고 있는지 확인하는 명령어이다.


cmd Result

[root@dev test]# ps -ef | grep com.socket.server.Server
root     32298     1  0 09:46 pts/1    00:00:02 /usr/local/java/bin/java -server -mx128M -ms64M -cp :./lib/TomcatActionSocket.jar:./lib/log4j-1.2.17.jar -DServerHome=. -Dpid=32297 com.socket.server.ServerSocketConnect
root     32545 32059  0 11:05 pts/2    00:00:00 grep com.socket.server.Server

 

 

2. 프로세스 PID만 얻어오기

 ps -ef | grep com.socket.server.Server | awk '{print $2}'

위 1번 cmd를 실하면 result와 같이 process정보를 각 열로 정리해서 보여준다
우리가 원하는 PID 정보는 2열에 존재하며 awk '{print $2}'를 붙이면 원하는 결과를 가져올 수 있다.

print 숫자에 따른 값 정보

$1 (권한)

$2 (Process ID)

$3 (부모 Process ID)

 $4~~ (etc)

 root

33298

 1

 ....(이 외 정보들)

참고로 awk '{print $2}'에 숫자는
awk '{print $1, $2}', awk '{print $1 $2}' 등 원하는 정보값을 열에 맞게 설정해서 가져올 수 있다.


cmd Result

[root@dev test]# ps -ef | grep com.socket.server.Server | awk '{print $2}'
32298
32583
[root@dev test]# ps -ef | grep com.socket.server.Server | awk '{print $1,$2}'
root 32298
root 32586

 

 

3. 얻어 온 PID정보를 파일로 저장하기

 ps -ef | grep com.socket.server.Server | awk '{print $2}' > pid

검색한 정보를 현재 디렉토리에 pid라는 이름으로 저장하는 명령이다.
이번 프로젝트를 하면서 개인적으로
PID값을 저장해서 shell Script에서 for문을 사용할 때 pid라는 파일을 불러와 사용하고 있다.


cmd Result

[root@dev test]# ps -ef | grep com.socket.server.Server | awk '{print $2}' > pid
[root@dev test]# vim pid
32005
32293

 

'OS > Linux' 카테고리의 다른 글

[ShellScript] Host IP/Name 불러오기, 변수선언  (0) 2021.01.19
Linux에서 Java class 실행시키기  (0) 2018.05.11

회사업무 중 Linux서버에 소켓서버를 둔 후 Client에서 shellScript를 실행시키는 프로그래밍을 하게 되었습니다.

이와 관련된 내용을 정리함과 동시에 sample소스를 함께 추가해보겠습니다!

 


- TCP/IP Socket 통신?

클라이언트와 서버가 지정된 포트를 이용해 통신한다.

클라이언트에서 연결하거나 데이터 교환시에 포트를 이용하며 JAVA에서는 ServerSocket와 Socket를 이용하여 구현한다.

 

- Client Socket (클라이언트 소켓)

최초 포트에 접속을 요청하는 소켓이다. 서버소켓으로 연결을 요청하고 데이터 전송을 한다.

 

- Server Socket (서버 소켓)

서버에서만 사용되는 소켓으로 클라이언트에서 연결 요청이 오기까지 대기상태를 유지않다.

이후 연결 요청시 클라이언트화 연결을 하고 서버내에 소켓을 만들어 데이더 작업을 진행한다.

 

Java 소켓통신 관련 소스코드

클라이언트 소켓과 서버소켓을 sample 소스코드를 소개합니다.

아래의 코드는 가장 기본코드이며

Server소스에서는 Thread를 구현하여 여러 클라이언트가 들어와도 작업을 처리할 수 있도록 해주는 것이 더 좋습니다.

 

Client.java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
	
	final static String SERVER_IP = "127.0.0.1"; 
	final static int SERVER_PORT = 1225;
	final static String MESSAGE_TO_SERVER = "Hi, Server";
	
	public static void main(String[] args) {
		
		Socket socket = null;
		
		try {
			/** 소켓통신 시작 */
			socket = new Socket(SERVER_IP,SERVER_PORT);
			System.out.println("socket 연결");
		
			/**	Client에서 Server로 보내기 위한 통로 */
			OutputStream os = socket.getOutputStream();
			/**	Server에서 보낸 값을 받기 위한 통로 */
			InputStream is = socket.getInputStream();
			
			os.write( MESSAGE_TO_SERVER.getBytes() );
			os.flush();
			
			byte[] data = new byte[16];
			int n = is.read(data);
			final String resultFromServer = new String(data,0,n);
			
			System.out.println(resultFromServer);
			
			socket.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

 

Server.java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server extends Thread {
	
	final static int SERVER_PORT = 1225;
	final static String MESSAGE_TO_SERVER = "Hello, Client";
	
	public static void main(String[] args) {
		
		ServerSocket serverSocket = null;
		
		try {
			serverSocket = new ServerSocket(SERVER_PORT);
			
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		try {
			while (true) {
				System.out.println("socket 연결 대기");
				Socket socket = serverSocket.accept();
				System.out.println("host : "+socket.getInetAddress()+" | 통신 연결 성공");
				
				/**	Server에서 보낸 값을 받기 위한 통로 */
				InputStream is = socket.getInputStream();
				/**	Server에서 Client로 보내기 위한 통로 */
				OutputStream os = socket.getOutputStream();
				
				byte[] data = new byte[16];
				int n = is.read(data);
				final String messageFromClient = new String(data,0,n);
				
				System.out.println(messageFromClient);
				
				os.write( MESSAGE_TO_SERVER.getBytes() );
				os.flush();
				
				is.close();
				os.close();
				socket.close();
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

class SocketRun implements Runnable {

	private Socket socket = null;
	
	SocketRun( Socket socket ){
		this.socket = socket;
	}
	
	@Override
	public void run() {
		
	}
}

'Programming > JAVA' 카테고리의 다른 글

[Java] 특정 URL로 redirect 하기  (0) 2018.05.28

+ Recent posts