Was passiert, wenn man in PHP unter Linux exec() benutzt und den Aufruf in den Hintergrund stellt?
Nicht was Du willst. Mit installiertem at „geht was“. Das installiert und aktiviert den Dienst atd
, der dann das übergebene Programm unabhängig im Hintergrund ausführt. man at
hilft Dir weiter:
Nur nachmachen, wenn man weiß, was man tut:
Vater-Prozess:
<?php
### File: /tmp/vater.php
foreach ( [1,2] as $i ) {
$cmd="echo /tmp/kind.sh '$i' | at now";
echo "Starte $cmd\n";
exec($cmd);
echo "...Prozess $i gestartet\n\n";
}
exit;
Kind-Prozess:
#!/bin/bash
### File: /tmp/kind.sh
### Caution! This will never ending!
echo -n "$$ $0 $*" > "/tmp/$1.pid";
nr=$1;
while [ 1 -eq 1 ]; do
echo -n $1 >> "/tmp/${nr}";
echo -n ": " >> "/tmp/${nr}";
date >> "/tmp/${nr}";
echo "" >> "/tmp/${nr}";
sleep 1;
done
Starten:
/tmp$ php vater.php
Starte echo /tmp/kind.sh '1' | at now
warning: commands will be executed using /bin/sh
job 7 at Sat Mar 26 10:54:00 2022
...Prozess 1 gestartet
Starte echo /tmp/kind.sh '2' | at now
warning: commands will be executed using /bin/sh
job 8 at Sat Mar 26 10:54:00 2022
...Prozess 2 gestartet
/tmp$ _
(Das PHP-Skript ist an dieser Stelle beendet. Entweder baust Du etwas, was dieses am Leben erhält oder Du startest (JS, xmlhttprequest,…) regelmäßig ein neues, welches z.B. auf die Existenz von Dateien reagiert und dann ggf. weiter macht. Damit verlierst Du dann aber den Vorteil, dass Du so auch die Speicher- oder Laufzeitbeschränkungen von PHP oder dem Apache umgehst... Bei Rolfs Lösung greifen diese weiterhin.)
Dateien beobachten:
/tmp$ tail -fn0 /tmp/1 /tmp/2;
Prozesse beenden:
/tmp$ killall kind.sh
In den *.pid-Dateien seht jeweils wie folgt:
10519 /tmp/kind.sh 1
10524 /tmp/kind.sh 2
... also je eine Zeile mit "PID Befehl Argumente".
Jetzt musst Du „nur noch“ schauen, wie Du das gesteuert bekommst und was passiert wenn der Apache das startet. Ich habe die Versuche als normaler Benutzer in einem Terminal gemacht. Mit einem anderen Benutzer und ohne Terminal kann das ganz anders ausgehen.