Процесс Unix/Java прекращает работу при перемещении в фоновый режим

Процесс Unix/Java прекращает работу при перемещении в фоновый режим

У нас есть Java-процесс, созданный с помощью Appassembler. Он работает нормально, пока он запущен и выполняется на переднем плане:

[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 Job Control:

Фоновый процесс, который пытается прочитать или записать на свой управляющий терминал, отправляет сигнал SIGTTIN (для ввода) или SIGTTOU (для вывода). Эти сигналы останавливают процесс по умолчанию, но они также могут быть обработаны другими способами.

И изСтраница Ратгерса о промежуточном использовании Unix:

Работа, выполняемая в фоновом режиме, остановится, если ей потребуется ввод. Ввод не может быть предоставлен фоновому заданию, поэтому убедитесь, что все необходимые вводные данные доступны для него.

Как решениемы просто обновили наш процесс Java, чтобы принять необязательный аргумент, который заставит основной поток спать бесконечно, а не ждать ввода. У нас есть хук выключения, который будет обрабатывать сигналы SIGTERM/SIGINTсоответствующим образом:

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

Связанный контент