Как к Daemonize программа Java?

также может быть полезно знать логическую разницу между соединением, существует и в http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx

71
задан Rich Apodaca 10 February 2009 в 22:58
поделиться

7 ответов

Apache Демон палаты общин запустит Вашу программу Java как демон Linux или Услуги WinNT.

38
ответ дан Verhagen 7 November 2019 в 08:55
поделиться

Если Вы не можете полагаться , Сервисная Обертка Java процитировала в другом месте (например, при работе Ubuntu которая не имеет никакой упакованной версии SW), Вы, вероятно, хотите сделать это старомодный путь: имейте свою программу, пишут ее PID в/var/run/$progname.pid и пишут, стандартный сценарий SysV init (используйте, например, тот для ntpd как пример, это просто) вокруг этого. Предпочтительно, сделайте это совместимым LSB, также.

По существу, запуск функционирует тесты, если программа уже работает (путем тестирования, если/var/run/$progname.pid существует, и содержанием того файла является PID рабочего процесса), и если не работает

logfile=/var/log/$progname.log
pidfile=/var/run/$progname.pid
nohup java -Dpidfile=$pidfile $jopts $mainClass </dev/null > $logfile 2>&1

, функция остановки проверяет/var/run/$progname.pid, тесты, если тем файлом является PID рабочего процесса, проверяют, что это - Java VM (чтобы не уничтожить процесс, который просто снова использовал PID от мертвого экземпляра моего демона Java), и затем уничтожает тот процесс.

При вызове, мое основное () метод запустится путем записи его PID в файле, определенном в System.getProperty("pidfile").

Одно главное препятствие, хотя: в Java нет никакого простого и стандартного способа получить PID процесса выполнения JVM в.

Вот то, что я придумал:

private static String getPid() {
    File proc_self = new File("/proc/self");
    if(proc_self.exists()) try {
        return proc_self.getCanonicalFile().getName();
    }
    catch(Exception e) {
        /// Continue on fall-back
    }
    File bash = new File("/bin/bash");
    if(bash.exists()) {
        ProcessBuilder pb = new ProcessBuilder("/bin/bash","-c","echo $PPID");
        try {
            Process p = pb.start();
            BufferedReader rd = new BufferedReader(new InputStreamReader(p.getInputStream()));
            return rd.readLine();
        }
        catch(IOException e) {
            return String.valueOf(Thread.currentThread().getId());
        }
    }
    // This is a cop-out to return something when we don't have BASH
    return String.valueOf(Thread.currentThread().getId());
}
32
ответ дан agweber 7 November 2019 в 08:55
поделиться

Я часто пишу сценарии или командные строки, которые по существу похожи на это, если я хочу:

  1. Запущенный программа, которая неуязвима для регистраций
  2. , Который полностью разъединяется от оболочки, которая мечет икру, это, и
  3. Производит файл журнала из stderr и stdout, содержание которого отображено также, но
  4. , Позволяет мне прекращать просматривать происходящий журнал и делать, другой материал, не разрушая рабочий процесс

Обладает.

nohup java com.me.MyProgram </dev/null 2>&1 | tee logfile.log &
24
ответ дан Ben Hardy 7 November 2019 в 08:55
поделиться

Я предпочитаю команда nohup. Сообщение в блоге говорит, что существуют лучшие пути, но я не думаю, что они достаточно лучше.

15
ответ дан S.Lott 7 November 2019 в 08:55
поделиться

Это зависит. Если это - просто одноразовая вещь, я хочу к daemonize это и затем иду домой, но обычно я ожидаю результатов, я мог бы сделать:

nohup java com.me.MyProgram &

в командной строке. Для уничтожения его чисто у Вас есть много опций. Вы могли бы иметь слушателя для SIGKILL, или послушать на порте и завершить работу, когда связь установлена, периодически проверяйте файл. Подходы различия имеют различные слабые места. Если бы это для использования в производстве, я уделил бы ему более внимание и вероятно бросил бы сценарий в/etc/init.d, что nohups, это, и имеет более сложное завершение работы, такой как, что имеет кот.

4
ответ дан Don Branson 7 November 2019 в 08:55
поделиться

Вы могли попробовать Сервисная Обертка Java , общественный выпуск свободен и удовлетворяет Ваши потребности.

5
ответ дан John T 7 November 2019 в 08:55
поделиться

Этот вопросом является о daemonizing произвольная программа (не определенный для Java), таким образом, некоторые ответы могут относиться к Вашему случаю:

2
ответ дан Community 7 November 2019 в 08:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: