Unix/Java 프로세스는 백그라운드로 이동하면 실행이 중지됩니다.

Unix/Java 프로세스는 백그라운드로 이동하면 실행이 중지됩니다.

Appassembler를 사용하여 생성된 Java 프로세스가 있습니다. 포그라운드에서 시작되고 실행되는 한 잘 실행됩니다.

[ec2-user@ip-xxx ourapp-0.0.1-SNAPSHOT]$ bin/ourapp
Starting in APP_HOME=/home/ec2-user/app_home
Press Q to quit

그러면 애플리케이션에 성공적으로 액세스하고 테스트할 수 있습니다. 그러나 백그라운드에서 시작하면 실행이 중지될 뿐만 아니라 다시 활성화할 수도 없습니다.그것을 전경으로 가져 오는 것:

[ec2-user@ip-xxx ourapp-0.0.1-SNAPSHOT]$ bin/ourapp &
[1] 11661
Starting in APP_HOME=/home/ec2-user/app_home
Press Q to quit
                                                     ## Not accessible!
[ec2-user@ip-xxx ourapp-0.0.1-SNAPSHOT]$  jobs
[1]+  Stopped                 bin/ourapp
[ec2-user@ip-xxx ourapp-0.0.1-SNAPSHOT]$  bg %1
[1]+ bin/ourapp &                                    ## Still not accessible!
[ec2-user@ip-xxx ourapp-0.0.1-SNAPSHOT]$  jobs
[1]+  Stopped                 bin/ourapp
[ec2-user@ip-xxx ourapp-0.0.1-SNAPSHOT]$  fg %1
bin/ourapp                                           ## Now, it's accessible.

내가 잘못 시작한 걸까? 백그라운드에 있더라도 작업을 계속 실행하는 방법이 있습니까? 이것을 데몬 프로세스로 시작한 nohup다음 로그아웃해야 하지만 포그라운드 프로세스로 남아 있지 않으면 성공적으로 계속 실행할 수 없는 것 같습니다. 이는 불가능합니다.

답변1

입력을 기다리는 백그라운드 작업이 있는 것 같습니다.중지되었습니다대부분의 환경에서.

로부터Unix 작업 제어에 대한 Wikipedia 페이지:

제어 터미널에서 읽거나 쓰려고 시도하는 백그라운드 프로세스에는 SIGTTIN(입력용) 또는 SIGTTOU(출력용) 신호가 전송됩니다. 이러한 신호는 기본적으로 프로세스를 중지하지만 다른 방법으로 처리될 수도 있습니다.

그리고Unix의 중간 사용에 관한 Rutgers 페이지:

입력이 필요한 경우 백그라운드에서 실행 중인 작업이 중지됩니다. 백그라운드 작업에는 입력을 제공할 수 없으므로 필요한 모든 입력이 사용 가능한지 확인하십시오.

해결책으로우리는 입력을 기다리지 않고 메인 스레드를 무기한 휴면 상태로 만드는 선택적 인수를 허용하도록 Java 프로세스를 업데이트했습니다. 신호를 적절하게 처리하는 종료 후크가 있습니다 SIGTERM/SIGINT.

        if (args.length >= 0 && StringUtils.equals(args[0], "daemon")) {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

관련 정보