также может быть полезно знать логическую разницу между соединением, существует и в http://weblogs.sqlteam.com/mladenp/archive/2007/05/18/60210.aspx
Apache Демон палаты общин запустит Вашу программу Java как демон Linux или Услуги WinNT.
Если Вы не можете полагаться , Сервисная Обертка 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());
}
Я часто пишу сценарии или командные строки, которые по существу похожи на это, если я хочу:
Обладает.
nohup java com.me.MyProgram </dev/null 2>&1 | tee logfile.log &
Я предпочитаю команда nohup. Сообщение в блоге говорит, что существуют лучшие пути, но я не думаю, что они достаточно лучше.
Это зависит. Если это - просто одноразовая вещь, я хочу к daemonize это и затем иду домой, но обычно я ожидаю результатов, я мог бы сделать:
nohup java com.me.MyProgram &
в командной строке. Для уничтожения его чисто у Вас есть много опций. Вы могли бы иметь слушателя для SIGKILL, или послушать на порте и завершить работу, когда связь установлена, периодически проверяйте файл. Подходы различия имеют различные слабые места. Если бы это для использования в производстве, я уделил бы ему более внимание и вероятно бросил бы сценарий в/etc/init.d, что nohups, это, и имеет более сложное завершение работы, такой как, что имеет кот.
Вы могли попробовать Сервисная Обертка Java , общественный выпуск свободен и удовлетворяет Ваши потребности.
Этот вопросом является о daemonizing произвольная программа (не определенный для Java), таким образом, некоторые ответы могут относиться к Вашему случаю: