Die vom Unternehmen verwendeten geplanten Aufgaben sind ungefähr so:
*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testOne >/dev/null 2>&1*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testTwo >/dev/null 2>&1
Sie können sehen, dass die Ausgabe und der Standardfehler auf ein leeres Gerät umgeleitet werden Beschränken Sie sich auf diesen Grund. Ich habe einige Informationen überprüft und sie hier beschrieben:
1. SSH-Anmeldeserver <br> 2. Erstellen Sie eine neue PHP-Datei test.php mit dem folgenden Code:
<?php sleep(50); echo "aaa\n"; file_put_contents("/tmp/test.txt",time());?>
3. Verwenden Sie den folgenden Befehl, um das Programm test.php auszuführen
$ php test.php &
Zeigen Sie den Inhalt der Datei /tmp/test.txt als 1497613738 an
4. Führen Sie dann den folgenden Befehl erneut aus. Nachdem der Befehl ausgeführt wurde, verwenden Sie sofort den Exit-Befehl, um sich abzumelden
$ php test.php &
5 Melden Sie sich dann über ssh beim Server an und stellen Sie fest, dass der Inhalt von /tmp/test. txt-Datei ist immer noch 1497613738. Das bedeutet, dass bei der zweiten Ausführung von test.php die Funktion file_put_contents nicht oder nicht erfolgreich ausgeführt wurde.
6 Strace zum Tracking verwenden:
正常情况下的追踪: strace -p
Process 1475 attached restart_syscall(<... resuming interrupted call ...>) = 0write(1, "aaa\n", 4aaa ) = 4lstat("/tmp/test.txt", 0x7ffe792ebe90) = -1 ENOENT (No such file or directory) lstat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=65536, ...}) = 0open("/tmp/test.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0lseek(3, 0, SEEK_CUR) = 0write(3, "1497614186", 10) = 10close(3) = 0munmap(0x7f4840239000, 528384) = 0close(2) = 0close(1) = 0munmap(0x7f4847510000, 4096) = 0close(0) = 0munmap(0x7f4847511000, 4096) = 0sched_getaffinity(1475, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 128sched_setaffinity(0, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 0munmap(0x7f48404c8000, 2119936) = 0munmap(0x7f48406ce000, 2345056) = 0munmap(0x7f4840b39000, 2162536) = 0munmap(0x7f484090b000, 2282472) = 0munmap(0x7f4840d49000, 323584) = 0exit_group(0) = ? +++ exited with 0 +++[1]+ Done php test.php
<br>
Tracking nach dem Abmelden und erneuten Anmelden:
strace -p 3881
restart_syscall(<... resuming interrupted call ...>) = 0write(1, "aaa\n", 4) = -1 EIO (Input/output error) munmap(0x7f6b7fc04000, 528384) = 0close(2) = 0close(1) = 0munmap(0x7f6b86edb000, 4096) = 0close(0) = 0munmap(0x7f6b86edc000, 4096) = 0sched_getaffinity(3881, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 128sched_setaffinity(0, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 0munmap(0x7f6b7fe93000, 2119936) = 0munmap(0x7f6b80099000, 2345056) = 0munmap(0x7f6b80504000, 2162536) = 0munmap(0x7f6b802d6000, 2282472) = 0munmap(0x7f6b80714000, 323584) = 0exit_group(0) = ? +++ exited with 0 +++
Im Vergleich können Sie sehen, dass beim Echo ein Ein-/Ausgabefehler vorliegt und die Funktion file_put_contents nicht ausgeführt wird das Ende.
7 Grund:
Warum tritt nach dem Abmelden und erneuten Anmelden ein EIO-Fehler auf? Dies hängt mit der Linux-Sitzungsverarbeitung zusammen. <br>Wenn sich ein Benutzer über SSH bei einem Server anmeldet, wird eine Sitzung gestartet. Nach dem Start der Sitzung werden Standardeingabe (stdin), Standardausgabe (stdout) und Standardfehler (stderr) mit einem entsprechenden Terminal (pty) verbunden. <br>Nachdem sich der Benutzer angemeldet hat, wird jede Standardausgabe im Terminal angezeigt. Das Dateihandle für die Standardausgabe ist 1. Daher führt echo("aaan") in PHP dazu, dass der Systemaufruf write(1, "aaan", 4) im Terminal geschrieben wird. <br>Eine Sitzung endet, wenn sich der Benutzer abmeldet. Ändern Sie am Ende der Sitzung alle für das Terminal geöffneten Dateihandles so, dass sie nicht lesbar und nicht beschreibbar sind. <br> Wenn sich der Benutzer abmeldet und dann write(1, „aaan“, 4) ausführt, wird ein EIO-Fehler gemeldet. Weil das Terminal-Handle nicht mehr beschreibbar ist. Nachdem ein EIO-Fehler aufgetreten ist, wird der Prozess beendet.
Lösung<br>Methode 1: <br>Verwenden Sie das Umleitungssymbol &, um die Standardausgabe auf das Loch umzuleiten.
$ php test.php > /dev/null 2 >&1 & 这里的& 可以用也可以不用
Methode 2: <br>Nohup verwenden.
$ nohup php test.php &
Hinweis:
Wenn Sie einen Prozess ausführen und der Meinung sind, dass Sie sich von Ihrem abmelden sollten Konto Der Prozess wird noch nicht beendet, Sie können also den Befehl nohup verwenden.
Mit diesem Befehl kann der entsprechende Prozess weiterhin ausgeführt werden, nachdem Sie sich vom Konto abgemeldet/das Terminal geschlossen haben. nohup bedeutet, nicht aufzulegen (n ohang up).
Unser Unternehmen übernimmt die erste Methode in Bezug auf die Beschreibung von /dev/null 2 >&1 &, Siehe einen anderen Artikel
Das obige ist der detaillierte Inhalt vonPHP-Beispiele für geplante Aufgaben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!