PHP Überprüfen Sie die Prozess-ID

7

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%     
Ozzy 01.11.2009, 04:04
quelle

6 Antworten

17

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.

    
memnoch_proxy 01.11.2009, 04:06
quelle
6

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.

    
jheddings 01.11.2009 04:46
quelle
1

Nein, Sie können keine Prozesse pid ändern. Es wird vom Kernel zugewiesen und ist Teil der Datenstrukturen des Kernels

    
ennuikiller 01.11.2009 04:07
quelle
1

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.

    
spoofie 15.08.2017 23:33
quelle
0

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:

  • Berühren Sie irgendwo im Dateisystem eine "Sperrdatei". Ihr Skript überprüft dann, ob diese Datei vorhanden ist: Wenn dies der Fall ist, beenden Sie, andernfalls berühren Sie diese Datei und führen die Verarbeitung fort.
  • Festlegen eines datenbankbasierten Flags, um anzugeben, dass das Skript ausgeführt wird. Wie oben, aber verwenden Sie eine Tabelle / ein Feld, um ein Skript als ausgeführt zu markieren.

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.

    
Ian 01.11.2009 04:44
quelle
0

Vergessen Sie auch nicht, dass Sie Shell-Befehle über Backticks (') aufrufen können, die Ihnen Zugriff auf die Standard * nix-Tools für die Arbeit mit PIDs geben würden.

Quelle: Ссылка

    
Chris 01.11.2009 04:48
quelle

Tags und Links