2010-09-16 5 views
9

Wie hinzufügen Dämon stoppen, starten und melden Funktion zu diesem Daemon-Code?Erstellen eines Daemon mit Stop, Start-Funktionalität in C

#include <sys/types.h> 
#include <sys/stat.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <errno.h> 
#include <unistd.h> 
#include <syslog.h> 
#include <string.h> 

int main(void) { 

     /* Our process ID and Session ID */ 
     pid_t pid, sid; 

     /* Fork off the parent process */ 
     pid = fork(); 
     if (pid < 0) { 
       exit(EXIT_FAILURE); 
     } 
     /* If we got a good PID, then 
      we can exit the parent process. */ 
     if (pid > 0) { 
       exit(EXIT_SUCCESS); 
     } 

     /* Change the file mode mask */ 
     umask(0); 

     /* Open any logs here */   

     /* Create a new SID for the child process */ 
     sid = setsid(); 
     if (sid < 0) { 
       /* Log the failure */ 
       exit(EXIT_FAILURE); 
     } 



     /* Change the current working directory */ 
     if ((chdir("/")) < 0) { 
       /* Log the failure */ 
       exit(EXIT_FAILURE); 
     } 

     /* Close out the standard file descriptors */ 
     close(STDIN_FILENO); 
     close(STDOUT_FILENO); 
     close(STDERR_FILENO); 

     /* Daemon-specific initialization goes here */ 

     /* The Big Loop */ 
     while (1) { 
      /* Do some task here ... */ 

      sleep(30); /* wait 30 seconds */ 
     } 
    exit(EXIT_SUCCESS); 
} 

Antwort

6
  1. Schreiben Sie die pid des Daemon auf /var/run/mydaemonname.pid, so dass Sie später leicht die pid nachschlagen kann.
  2. Richten Sie einen Signalhandler für SIGUSR1 und SIGUSR2 ein.
  3. Wenn Sie SIGUSR1 erhalten, schalten Sie ein Stopp-Flag um.
  4. Wenn Sie SIGUSR2 erhalten, legen Sie eine Berichtsflagge fest.
  5. Überprüfen Sie in Ihrer while-Schleife jede Flagge.
  6. Wenn das Stopp-Flag gesetzt ist, stoppen Sie, bis es gelöscht ist.
  7. Wenn das Berichtsflag gesetzt ist, deaktivieren Sie die Markierung und führen Sie Ihren Bericht aus.

Es gibt einige Komplikationen um Stop/Start, aber wenn ich die Frage richtig verstehe, sollte dies Sie auf den richtigen Weg bringen.

Bearbeiten: Pid-Datei hinzugefügt, wie von Dummy00001 in einem Kommentar unten vorgeschlagen.

+0

Sie könnten auch die Erstellung einer PID-Datei erwähnen - so dass die PID ohne zu raten bekannt wäre. – Dummy00001

+0

@ Dummy00001 - Guter Anruf, danke. – bstpierre

5

Zuerst haben Sie wahrscheinlich so viel Forking und Haus nicht tun halten Sie sich: http://linux.die.net/man/3/daemon

Als nächstes erinnere mich, dass Schnittstelle Ihren Daemon auf der Welt wahrscheinlich durch eine Art von Shell-Skript, das Sie auch gelegen schreiben in /etc/init.d oder an einem anderen definierten Ort.

Also für die obige Antwort würde Ihr Shell-Skript diese Signale an die PID des Prozesses senden. Es gibt wahrscheinlich einen besseren Weg. Die Signalisierung wie oben ist ein einseitiger Prozess, Ihr Kontrollskript muss durch an die Bedingungen der Race-Conditions anfällige und fragile Creops springen, um zu bestätigen, ob der Daemon erfolgreich gestoppt oder neu gestartet wurde. Ich würde nach Präzedenz und Beispielen in /etc/init.d suchen.