Ich habe eine geänderte Klasse verwendet, die ich gefunden habe, um zu überprüfen, ob eine andere Instanz des gleichen Prozesses bereits ausgeführt wird. Das Problem besteht darin, dass die Methode zur Überprüfung des Prozesses eine weitere Instanz desselben Prozesses hinzufügt.Wie überprüft man, ob der Prozess auf Red Hat Linux läuft?
Wenn meine Anwendung startet, wird ein neuer Prozess-ID erstellt und ist sichtbar mit:
ps -A | grep "AppName"
Damit erhalte ich ein seit Eintrag zurückgekehrt, überprüfe ich dann für eine andere Instanz der Anwendung mit:
QString strCMD = "ps -A | grep \"" + mcstrAppName + "\"";
QProcess objProc;
objProc.start("bash", QStringList() << "-c" << strCMD);
if (objProc.waitForStarted() != true || objProc.waitForFinished() != true) {
mcpobjApp->exit(cleanExit(-1, "Unable to determine if another instance is running!"));
return;
}
Sobald die ‚Start‘ Methode eine andere Instanz derselben Anwendung in der Prozesstabelle wieder, verifiziert genannt wird angezeigt wird, mit:
ps -A | grep "AppName"
Es erscheinen nun zwei Einträge mit jeweils einer anderen PID. Ich habe auch versucht:
QString strOptions = "-A | grep \"" + mcstrAppName + "\"";
QProcess objProc;
objProc.start("ps", QStringList() << strOptions);
Das Ergebnis ist das gleiche, zwei Einträge in der Prozesstabelle.
Gibt es eine Möglichkeit, die Prozesstabelle für eine andere Instanz zu überprüfen, ohne eine zusätzliche Instanz hinzuzufügen?
Es gibt keine Möglichkeit zu sehen, ob eine bestimmte ausführbare Datei läuft, von innerhalb der spezifischen ausführbaren Datei selbst, nicht ohne tatsächlich die ausführbare Datei zu laden und auszuführen. Stattdessen empfehle ich Ihnen, eine Art Dateisperre für eine bestimmte Datei zu verwenden. Wenn die Datei gesperrt ist, läuft das Programm und Sie tun, was Sie tun müssen. Wenn es nicht gesperrt ist, sperren Sie es und fahren fort. Oder vielleicht ein gemeinsamer Semaphor oder etwas Ähnliches. –
Das Problem mit dieser Methode ist, dass, wenn die Datei gesperrt ist und es dann ein Problem mit der ausführbaren Datei gibt, ein Watchdog den Prozess auch nicht neu starten kann. – SPlatten
Wie wäre es mit einer PID-Datei? Eine Datei, deren Inhalt die PID des laufenden Prozesses ist? Wenn es vorhanden ist und die PID vorhanden ist und mit der ausführbaren Datei übereinstimmt, wird der Prozess ausgeführt. Wenn die Datei nicht existiert oder die PID nicht existiert oder existiert, aber nicht mit der ausführbaren Datei übereinstimmt, wird das Programm nicht ausgeführt und Sie überschreiben die PID-Datei. Funktioniert gut mit einem Watchdog, der denselben Check durchführt. –