2010-10-13 7 views
18

Ich habe einen kleinen Daemon in Java gebaut und möchte ihn als Dienst unter Unix (z. B. Debian 5) ausführen. Ich habe gelesen, dass es die Möglichkeit gibt, einen Java-Wrapper zu verwenden, aber gibt es keine andere Option, die einfacher zu implementieren ist? Kann ich nicht einfach einen Unix-Befehl wie xxx java -jar program.jar verwenden?Java läuft als Unix-Dienst

+0

http://commons.apache.org/daemon/jsvc.html –

+0

Überprüfen Sie in serverfault.com/superuser.com. Das System könnte mehr darüber wissen (nohup, inittabs, cron etc) – Jayan

Antwort

29

Nun, auch wenn Sie Ihr Java-Programm ausführen möchten, wenn Sie Ihrer Shell verlassen aus, ist die folgende die einfachste Art und Weise :

$nohup java -jar program.jar & 
+10

erwägen, stderr und stdout als Teil des Befehls umzuleiten. z.B. 'nohup java .... 1>/dev/null 2> & 1 &' – JeremyP

1

Sie können einen Cron-Job verwenden, um Ihr Programm zu planen. Sie können auch den Artikel this lesen, um zu erfahren, wie Skripts beim Start ausgeführt werden. Sie können ein Skript schreiben, das Ihr Java-Programm ausführt und es beim Start wie in dem Artikel erwähnt ausführen.

+0

Dies ist gut, wenn Sie ein Programm regelmäßig ausführen möchten. Das Programm sollte dann beendet werden, wenn es fertig ist. – KarlP

4

Du kannst es als:

normalerweise von Softlinks in /etc/rcX.d -
java -jar program.jar 

Unix-Daemons werden normalerweise von init oder gestartet durch ein Skript in /etc/init.d oder /etc/rc.d und begann zu bestimmten Runlevels gestartet. (wo X ist der beabsichtigte "runlevel", der normalerweise 3.

Ich denke, Debian sind mit "upstart", ein init-Ersatz. Es verwendet Konfigurationsdateien in /etc/init, um Jobs zu definieren, und sie sind ziemlich einfach zu Schreiben Sie das.

Daemons schließt traditionell stdin, sdtout und stderr, und macht eine "Doppelgabel" beim Start, um sich von der Sitzung zu lösen und auch zu signalisieren, dass sie bereit sind, alles zu handhaben Dies ist nicht wirklich notwendig, solange der Daemon nicht vom Terminal gestartet wird

Wenn Sie einen einfachen Shell-Wrapper zum Starten des Programms benötigen, müssen Sie nur eine kleine Shell s schreiben cript:

#!/bin/sh 
/full/path/to/java -jar /full/path/to/program.jar 

... und es ausführbar machen (chmod 755)

10

Sie benötigen ein entsprechendes Skript in /etc/init.d und verknüpfen es mit /etc/rcX.d Verzeichnisse zu erstellen. Das Skript sollte mindestens start, stop und status Parameter unterstützen. Beim Start sollte java Befehl mit entsprechenden Argumenten ausgeführt werden, wahrscheinlich über nohup java <arguments> &. Dann sollten Sie die PID Ihres neu gestarteten Prozesses in der Datei /var/run/yourservice.pid speichern. stop Befehl sollte diese PID-Datei lesen und diesen Dienst beenden. Die Details variieren von Distribution zu Distribution, die meisten Distributionen bieten einige Makros, die die Arbeit erleichtern. Am besten schauen Sie sich Beispiele für andere Dienste in /etc/init.d für Ihre Distribution an.

Zusätzlich: Wenn Ihr Dienst nicht von anderen Computern aus dem Netzwerk zugegriffen wird, aber es einen Port öffnet, machen Sie es mit der Firewall nicht verfügbar.

Wenn Ihr Dienst einige 'empfindliche' Daten verarbeitet, ist es gut, einen weiteren Benutzer hinzuzufügen und einen entsprechenden sudo Befehl in Ihrer /etc/init.d Datei aufzurufen.

+0

Unter Debian gibt es ein vorgefertigtes Skript, das Sie kopieren und an Ihre Bedürfnisse anpassen können: '/ etc/init.d/skeleton' – barjak

+0

Auf Linux-Computern gibt es einen Dienstprogrammbefehl, 'chkconfig', der die Verknüpfungen in den Verzeichnissen/etc/rcX für Sie erstellt, indem er spezielle Formatkommentare in Ihrem Skript untersucht. – Raedwald