javaprogramm als dämon starten lassen

L

LUZA

Grünschnabel
[gelöst] javaprogramm als dämon starten lassen

hey leutz...

ich hab ein java programm, was einigermassen wie ein dämon aufgebaut ist, d.h. die main startet mit start die run-methode von meiner durch vererbung gebastelten klasse ( extends thread).

in der run-methode gibts ne endllosschleife, wo auf ports gehört wird.
das ganze funktioniert auch, wenn ich das programm explizit über konsole starte ( und konsole offen lasse). aber sobald die konsole zu ist ( auch wenn ich die vm als hintergrundprozess gestartet habe mit &), verreckt auch das programm.

eintrag in boot.local, bei yast im runlevel-editor und mit scripts in init.d und den rcX.d ordner hat auch nicht gefunkt.

wie kann ich nun dieses programm beim booten als hintergrundprozess starten lasse? muss ich dafür wie bei c irgendwo mit fork oder ähnlichem rumfrickeln oder gehts einfacher?


mfg und danke schonmal für eventuelle antworten,
ich
 
Zuletzt bearbeitet:
Zuerstmal muss das Programm so gebaut sein, dass es sich vom Control-TTY löst. Erst dann kann es als Daemon laufen, sonst kann es lediglich im Hintergrund laufen, indem es mit einem &-Zeichen in den Hintergrund geschoben wird. Alternativ startest du das Programm einfach im Screen und schliesst den Screen mit Strg+A Strg+D. Damit läuft das Programm auch weiter, wenn du dich ausloggst.
 
also müsste ich eine wie auch immer geartete fork-like schematik verwenden?
 
Jep, und stdout sowie stderr schliessen. In C würde das dann etwa so aussehen:
Code:
    freopen(LOG_ERR_FILE, "a", stderr);
    setbuf(stderr, NULL);
    freopen(LOG_FILE, "a", stdout);
    setbuf(stdout, NULL);
#ifdef _POSIX_SOURCE
    setsid();
#else // !_POSIX_SOURCE
#ifdef SYSV
    setpgrp(); // der SysV-Weg
#else // !SYSV
    setpgid(0, getpid()); // der POSIX-Weg
#endif // SYSV
#ifdef  TIOCNOTTY
    {
      int fd;
      if ((fd = open("/dev/tty", O_RDWR)) >= 0) {
        ioctl(fd, TIOCNOTTY, (char *) 0);       /* lose controll TTY */
        close(fd);
      }
    }
#endif // TIOCNOTTY
#endif // !_POSIX_SOURCE

Wie das mit Java geht, wüsste ich jetzt aber nicht, dazu habe ich zu wenig mit Java zu tun. Obiges Code-Fragment hab ich halt erst kürzlich für einen Dämon gebraucht, denke aber, dass es ähnlich auch in Java umsetzbar sein sollte.
 
Ich weiss nicht, ob das hier Anwendung findet, aber gibt es nicht eigentlich den Befehl 'nohup', um ein Programm ueber das Beenden der Konsole hinaus am Laufen zu halten?
 
ka, mal angucken...

ansonsten wirds also doch auf das verhasste fork-gefrickel hinauslaufen. dann kann ich das ganze eigentlich sofort in c schreiben...
 
ich habs jetzt hinbekommen.

ein eintrag in die boot.local, der ein script startet.
in dem script wird mit cd das arbeitsverzeichnis auf das verzeichnis gesetzt, wo die datei und somit meine klasse Daemon ist ( die eine main enthält und der dämon ist) und dann mit "nohup java Daemon & disown" der dämon gestartet.

wichtig war der wechsel mit cd ins verzeichnis, wo der dämon ist, auch wenn das aufrufende script im selben verzeichnis liegt, weils sonst den altbekannten und immer wieder widerlichen NoClassDefFoundError gibt.

also danke an alle, es geht jetzt!

mfg, ich
 
doch, glaub schon... ich habs zwar nicht ohne ausprobiert, aber es sorgt ja dafür, dass sich das programm nicht nur in den hintergrund schiebt, sondern auch sozusagen von der aufrufenden session löst.

was disown genau macht, weiss ich jetzt garnicht, aber es funktioniert**
 
was disown genau macht, weiss ich jetzt garnicht, aber es funktioniert**

Wahrscheinlich garnichts, wenn du nicht gerade die zsh nutzt.
Code:
disown [ job ... ]
job ... &|
job ... &!
       Remove the specified jobs from the job table; the shell will  no
       longer  report their status, and will not complain if you try to
       exit an interactive shell with them running or stopped.   If  no
       job is specified, disown the current job.

       If  the  jobs are currently stopped and the AUTO CONTINUE option
       is not set, a warning is printed  containing  information  about
       how  to make them running after they have been disowned.  If one
       of the latter two forms is used, the jobs will automatically  be
       made  running,  independent  of the setting of the AUTO CONTINUE
       option.
 

Ähnliche Themen

programme nach anmeldung automatisch starten

Zurück
Oben