Daemon über Putty/SSH starten



  • Hallo Forum,

    ich habe ein Daemon in C geschrieben.
    Wenn ich mich auf meinem Server über Putty/SSH anmelde und den Daemon über Putty starte, kann ich hinterher das Putty-Fenster nicht mehr schliessen.
    Ich hatte angenommen, dass es daran lag, dass stdin, stdout und stderr noch offen waren. Jedoch auch nachdem ich die Handles mit fclose geschlossen habe kann sich putty am ende einer Sitzung, in der ich den Daemon gestartet habe, nicht beenden.
    Mein System Debian Sarge, GNU C

    Weiss jemand Rat?

    gruss
    lars



  • Wenn der daemon noch laeuft wenn du dich ausloggen moechtest geht das natuerlich nicht...
    Du solltests den daemon im Hintergrund starten, was du mit diesem command erreichst:

    <dein_daemon> & >/dev/null
    


  • sorry mein fehler.

    ich habe wohl die letzte version nicht richtig ausgetauscht. daher wurde die alte version mit geöffneten filedescriptoren gestartet.

    nun läuft das schliessen des puttys einwandfrei. 🙄

    @wave
    ich hatte angenommen, dass "&" lediglich zum starten von normalen programmen als daemon gedacht ist um diese im hintergrund laufen zu lassen.
    ich mache das verlagern des prozesses in den hintergrund innerhalb des programms selbst und kann daher auf das starten mit "&" verzichten. das >/dev/null habe ich durch schliessen der descriptoren ebenfalls programmintern gelöst.
    trotzdem danke für die hilfe.

    die besten fehler sind die, die man sich selbst einbaut^^

    gruss
    lars



  • @llaehn:

    Ich stehe bald auch noch vor dem Problem auf meinem SuSE 10.0 system einen daemon zu schreiben (ein prog was ssh user anzeigt die grade eingeloggt sind) ...
    Was mich interessiert ist, wie du den Service registriet hast, das er auch als System-Service laeuft und was du noch diesbezueglich intern gemacht hast?

    gruss wave



  • wenn ich dich jetzt richtig verstanden habe, möchtest du wissen, wie ich aus dem programm den daemon gebaut habe. was du also mit "<bin-file> &" gemacht hast.

    dazu habe ich den befehl fork() verwendet. fork erstellt vom laufenden prozess eine kopie (inklusive aller variablen, constanten, functionen usw.). Die kopie bekommt eine eigene pid und läuft zusätzlich im system.

    im groben kann man folgendes schreiben :

    int main () {
     int pid;
    
      switch (pid=fork()) {
       case 0 :
        // kindprozess
        printf("ich bin ein kindprozess");
        exit(EXIT_SUCCESS);
        // kindprozess beendet 
    
       case -1 :
        // fehler beim erzeugen des kindprozesses
    
       default :
        // elternprozess
    
      }
    }
    

    folgendes buch hat mit dabei (zumindest für den anfang) sehr weitergeholfen : http://www.pronix.de/pronix-608.html.

    weiterführende informationen habe ich mir aus http://www.pronix.de/pronix-609.html sowie dem weltweitem netz gesucht.

    ich hoffe ich hatte deine frage richtig verstanden 😕

    gruss
    lars



  • Jo, danke erstmal, das meine ich im groben...
    Da ware noch die Frage ob dann das normale Progamm weiter laeuft bzw. ob man das normale Programm beenden kann ohne den Kinprozess zu "toeten".

    Ja, das Pronix hab ich mir mal angeschaut und ich hatte mir auch schon die eine offline version gedownloaded...



  • der parentprozess kann beendet werden, wenn der child gestartet ist.
    der child wird in dem fall dann vom init adoptiert.

    habe ich ebenfalls so gelöst. es gibt einige ansätze im netz, die den elternprozess laufen lassen, dies fand ich aber nicht so toll. meine philosophie war
    - launcher wird gestartet
    - child(worker)prozess wird vom launcher erzeugt
    - launcher wird beendet

    gruss
    lars


Anmelden zum Antworten