Langlaufender PHP -Prozess steckte in der Schleife - Strace -Ausgabe enthalten
Frage
Ich habe einen langjährigen PHP -Prozess, der manchmal in einer Schleife hängt. Dies ist die Strace -Ausgabe, aber ich weiß nicht, was es bedeutet:
nanosleep({1, 0}, {1, 0}) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({1, 0}, {1, 0}) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({1, 0}, {1, 0}) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({1, 0}, <unfinished ...>
Die oben genannten Anrufe werden auf unbestimmte Zeit verkleinert, und der Prozess wird nicht wiederhergestellt. Was bedeuten die obigen Anrufe?
Lösung
Entschuldigung, meine vorherige Antwort war falsch. Es wartet unendlich:
// Ignore SIGCHLD (Child process stopped or terminated)
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
// Set handler to SIGCHLD to default (i.e. ignore)
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
// Un-ignore SIGCHLD
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
// Sleep for a second
nanosleep({1, 0}, {1, 0}) = 0
Ich habe keine Ahnung, warum Sie Signalhandler in einer Schleife installieren würden, aber dies ist das Verhalten, das durch den folgenden PHP -Code verursacht wird:
while (true) {
sleep(1);
}
Ich kann mir keinen Grund vorstellen, warum Sie den Schlaf für nicht entfesseln sleep
, usleep
oder time_nanosleep
.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow