Das ist etwas, worüber ich mich eine Weile gewundert habe und beschlossen habe, danach zu fragen.
Wir haben die Funktion getmypid (), die die aktuelle Skript-Prozess-ID zurückgibt. Gibt es irgendeine Funktion wie
?checkifpidexists () in PHP? Ich meine eine eingebaute und nicht irgendeine Batch-Script-Lösung.
Und gibt es eine Möglichkeit, eine Skripte pid zu ändern?
Eine Klarstellung:
Ich möchte überprüfen, ob eine PID vorhanden ist, um zu sehen, ob das Skript bereits läuft, damit es nicht noch einmal ausgeführt wird, faux cron job, wenn Sie so wollen.
Der Grund, warum ich die PID ändern wollte, ist, dass ich das Skript pid auf etwas wirklich Hoch wie 60000 und harten Code setzen kann, so dass dieses Skript nur auf dieser PID laufen kann, so dass nur 1 Instanz davon laufen würde. p>
BEARBEITEN ----
Um anderen mit diesem Problem zu helfen, habe ich diese Klasse erstellt:
%Vor%und du benutzt es so:
%Vor%In Linux würden Sie / proc.
betrachten %Vor%In Windows könnten Sie shell_exec () tasklist.exe verwenden und eine passende Prozess-ID finden:
%Vor%Ich glaube, was Sie tun möchten, ist eine PID-Datei zu pflegen. In den Daemons, die ich geschrieben habe, überprüfen sie eine Konfigurationsdatei, suchen nach einer Instanz einer PID-Datei, holen die PID aus der PID-Datei, prüfen, ob / proc / $ pid existiert, und löschen die PID Datei.
%Vor%Prozess-IDs werden vom Betriebssystem erteilt und eine Prozess-ID kann nicht reserviert werden. Sie würden Ihren Daemon schreiben, um die PID-Datei zu respektieren.
Eine bessere Möglichkeit, dies zu erreichen, wäre die Verwendung einer PID- oder einer Sperrdatei. Überprüfen Sie einfach die Existenz der PID-Datei, erstellen Sie sie nach Bedarf und füllen Sie sie mit Ihrer laufenden PID-Datei.
%Vor%Und benutze es wie folgt:
%Vor%Es gibt nicht viele Fehler, die hier überprüft werden, aber ein kurzer Durchlauf zeigt, dass dies auf meinem System funktioniert.
Nein, Sie können keine Prozesse pid ändern. Es wird vom Kernel zugewiesen und ist Teil der Datenstrukturen des Kernels
Um zu überprüfen, ob auf einer Windows-Maschine eine PID existiert, verwende ich:
%Vor%Beachten Sie, dass $ outputB [0] eine Nachricht enthält, die pid nicht gefunden werden kann, wenn das pid tatsächlich nicht existiert! Um das zu validieren, benutze ich das zweite Argument.
Wie andere bereits gesagt haben, können Sie die Prozess-ID nicht ändern - sie wird vom Kernel des Betriebssystems zugewiesen und vollständig verwaltet. Außerdem haben Sie nicht gesagt, ob das Kommandozeilen- oder Web-Server-basiert ist: Wenn es Letzteres ist, erhalten Sie möglicherweise nicht einmal die PID Ihres Skripts.
Die Handbuchseite für getmypid () enthält einige Beispiele für "optimistische" Sperren. Ich benutze das Wort optimisitc, da PHP sich niemals einer asp.net-Webapplikation annähern wird, wo Sie eine True-Threaded-Umgebung mit shared / statischen Klassen haben und somit Singletons verwenden / missbrauchen können. Grundsätzlich haben Sie die Möglichkeit:
Beide hängen davon ab, dass das Skript korrekt beendet wird (der letzte Schritt wäre, das Sperrdatei / db-Flag zu entfernen). Wenn ein Skript aus irgendeinem Grund (oder der Maschine selbst) abstürzt, können Sie einen manuellen Bereinigungsprozess ausführen, um die Markierung zu entfernen. Es gibt keine einfache Lösung dafür, aber ein Weg, den es zu erforschen gäbe, wäre dann, das Datum zu betrachten, das die Sperre stempelt, mit einem willkürlichen "wenn älter als X, der letzte Lauf muss abgestürzt sein" -Ansatz.