Mehrfaches Starten verhindern



  • Hallo
    Gibt es eine Methode um mehrfaches starten eines Programms zu verhindern ?
    Momentan mache ich so was durch ablegen einer Datei im tmp-Verzeichnis, aber das hat mindestens den Nachteil, dass das Programm abstürzen kann und die Datei wird nicht gelöscht.
    Und einfach nach einem Prozess mit gleichen Namen zu suchen ist auch nicht das richtige, schließlich können zwei verschiedene Prozess gleichen Namen haben.

    Gibts da vielleicht noch eine andere Methode ?



  • Marcin schrieb:

    Hallo
    Gibt es eine Methode um mehrfaches starten eines Programms zu verhindern ?
    Momentan mache ich so was durch ablegen einer Datei im tmp-Verzeichnis, aber das hat mindestens den Nachteil, dass das Programm abstürzen kann und die Datei wird nicht gelöscht.

    eine gute Methode fällt mir nicht ein. Aber das Problem mit der Datei und dem Absturz kann man glaube ich umgehen, wenn der gestartete Prozess einen Lock auf die Datei aufruft und du beim starten des Prozesses prüfst ob die Datei existiert und wenn sie existiert ob darauf ein Lock existiert. Stürzt der Prozess nun ab, gibt der Kernel den Lock automatisch frei.

    btw. in /tmp-schreiben ist keine gute Idee, vor allem wenn du einen fixen-Dateinamen hast. Schreib besser nach ~/.programname oder so was!



  • Marcin schrieb:

    Und einfach nach einem Prozess mit gleichen Namen zu suchen ist auch nicht das richtige, schließlich können zwei verschiedene Prozess gleichen Namen haben.

    Nach etwa dem Prinzip gibt es eine Lösung für Windows (ich weiß aber nicht, ob die für UNIX anwendbar ist). Zuerst suchst du, ob ein Prozess mit deinem Namen existiert. Wenn nein, bis du fertig, andernfalls schickst du ihm eine Nachricht* - wenn der andere Prozess in absehbarer Zeit nicht auf diese Nachricht antwortet, hat er nichts mit dir zu tun (natürlich mußt du dann irgendwo in der Programm-Logik überwachen, ob du eine entsprechende Nachricht zugeschickt bekommst).

    * in Windows-Systemen verwendet man SendMessage() und Kollegen, ob es etwas äquivalentes unter UNIX gibt, weiß ich nicht



  • @rüdiger
    Das ist gute Idee, ich werd es so machen bis mir was besseres einfällt.

    @CStoll
    Das ist auch eine gute Idee obwohl ich so auf Anhieb nicht weiss wie man es implementieren könnte, aber schließlich kann kill Signale an Prozesse senden also es muss gehen.

    Danke für die Antworten.



  • Unter Windows funktioniert das mit Semaphoren:

    HANDLE hSem = CreateSemaphore(NULL, 0, 1, "Name der Anwendung");
    
    if (hSem != NULL && GetLastError() == ERROR_ALREADY_EXISTS)
    {
       CloseHandle(hSem);
       // Anwendung läuft bereits
       exit(-1);
    }
    

    oder so ähnlich



  • Könnte man unter Linux auch machen. Dazu muss man sich zuerst mit ftok eine IPC-ID zu der Anwendung holen (argv[0] als ersten Parameter) und dann versuchen mit semget eine Sempaphore zu erzeugen. Existiert diese und ist gesperrt -> Programm läuft schon.

    Ist allerdings von mir in der Praxis noch nicht benutzt worden 😉



  • Hallo
    Danke auch für diesen Vorschlag, allerdings hat man mit Semaphoren das gleiche Problem wie mit einer Datei: stürzt das Programm ab, der Semaphor bleibt. Das Programm lässt sich nicht wieder starten.
    Es sei es ist möglich dem Kernel zu sagen, dass ein Semaphor gelöscht werden soll wenn ein Prozess beendet ist.



  • Wenn ich das Manual richtig verstehe kannst Du bei semop SEM_UNDO angeben, damit der Semaphor entsperrt wird wenn das Programm beendet. Es ist ja nicht tragisch wenn er schon vorhanden ist, er darf nur nicht gesperrt sein. Damit kannst Du sogar unterscheiden Prozess läuft (Semaphor da und gesperrt), Prozess ist abgestürzt (Semaphor da aber nicht gesperrt) und Prozess läuft nicht/wurde regulär beendet (Semaphor nicht vorhanden).



  • Ja, mit diesem SEM_UNDO-Flag kann das funktioiern, der Semaphor bleibt zwar wird aber vom kernel zurückgesetzt. Ok, ich versuch das dann zu implementieren.
    Vielen Dank


Anmelden zum Antworten