mcvzone
282
2017-10-24 09:19:38 작성 2017-10-24 09:25:14 수정됨
4
2326

java process 종료 시점.


안녕하세요.

찾다가 없어서 여기 까지왔습니다. ㅎㅎ


아래 프로그램의 의도는 다음과 같습니다.

데몬을 만들어 실행 시켜두고, 데몬을 종료 해야 하는 경우, 내부 변수가 가지고 있던 값을 file 에 저장되도록 해야 하는 프로그램 입니다.


> CASE 1.

public static void main(String [] args) {

    try{

        ServerSocket s = new ServerSocket("",1001);

        while(true){

            Socket c = s.accept();

        }

    } catch( Exception e ){

    } finally {

        //::TODO abcd~~~~~

    }

}


===========================================================================


> CASE 2.


public static void main(String [] args) {

    TestThread t = new TestThread();

    t.start();

}

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

class TestThread extends Thread{

    public void run(){

        try{

            ServerSocket s = new ServerSocket("",1001);

            while(true){

                Socket c = s.accept();

            }

        } catch( Exception e ){

        } finally {

              //::TODO abcd~~~~~

        }

    }

}



위와 같이 프로그램을 실행 시켜 둔 상태에서, process 를 kill 시키거나, 혹은 eclipse 의 console 창에서 stop 을 시킨 경우, finally 부분을 타지 않고 그냥 소멸 되어버리네요.


보통 어떻게 처리 하시나요?

고견 부탁 드립니다.


감사합니다.

0
  • 답변 4

  • 구구구구우
    1k
    2017-10-24 09:44:18

    process 를 kill 시키거나, 혹은 eclipse 의 console 창에서 stop -> 이걸로는 불가능 합니다. JVM을 Kill 하는거지 JVM위에 돌아가는 어플리케이션을 종료시키는게 아니니까요. (지금 작성하려는 코드(또는 작성할수 있는 코드는)는 어플리케이션 코드잖아요)

    그리고 finnally로 해당상황을 컨트롤 할수 없습니다. 어플레케이션이 종료되는데 finnally 코드가 실행되길 기대한다는건 말이 안돼죠(잘생각해보세요)

    어플리케이션이 종료 시점에 Listener를 달수는 있습니다. 아래 관련 글이 있으니 한번 보세요

    http://blog.seulgi.kim/2014/06/java-shutdown-hook.html

  • mjxaone
    35
    2017-10-24 11:34:54 작성 2017-10-24 11:36:40 수정됨

    JFrame이라던지는 종료에 대한 리스너가 있으니 건너뛸께요.

    Windows OS 에선 모르겠네요.

    저 같은경우 Linux 기반에선, kill 시
    $kill -9 [pid] 로 종료하지 않고,
    $kill -15 [pid] 로 종료명령을 줍니다.

    -15 옵션을 주면 java코드단에선 아래 listener 코드가 작동합니다.


        // 서버 종료시 수행 작업 정의
        Runtime.getRuntime().addShutdownHook(new Thread() {
          @Override
          public void run() {
            // Todo: 종료시 수행할 코드 입력
          }
        });


    위의 방법은 프로세스를 수동적으로 종료할때 사용하는 방식이고, 
    실질적으로 저같은 경우는 서버용도로 사용하기때문에, DB넣어둔 명령 테이블을 읽어들여 스스로 종료되도록 코드를 작성했습니다.

  • 구구구구우
    1k
    2017-10-24 12:16:04

    kill 시 종료 명령을 줘서 하는 방식이면 가능하겠네요. 윈도우에서 종료명령을 주는 방법을 찾아보세요

  • mcvzone
    282
    2017-10-27 16:54:15

    정보 감사드립니다.

    구구구구우님 께서 남겨 주신 링크글은 여기에 글 올리기 전에 시도 해봤던 방법이긴 하거든요.

    그래서 지금은 RMI 방식으로 처리 해놓긴 했습니다만, unix 기반에서 수행 시킬거라서, mjxaone 님 말씀 해주신 걸 확인 해봐야 겠네요. 소스가 간단해 지겠네요.


    구구구구우님, mjxaone 님 좋은 정보 너무 감사드립니다.

  • 로그인을 하시면 답변을 등록할 수 있습니다.