Szenario ist, dass ich mit php Konsolenprozesse in den Hintergrund schieben will. Die Prozesse sollen auf eine txt.Datei ausgeben, die ich mit neuem php-Skriptaufruf auslesen kann. Die Prozesse sollen lesen von einer fifo, in die ich mit einem (wiederum neuen) php-Skriptaufruf schreiben kann.
Zur Erläuterung des Problems lassen wir php mal außen vor, denn es klappt schon von der Konsole aus nicht (2. Alt.)
Szenario
Das Programm
Code: Alles auswählen
passwd
pipe und txt werden angelegt mit
Code: Alles auswählen
mkfifo fifo.my
touch out.my
und heißen entsprechend.
1. Grundvariante (geht nicht)
Code: Alles auswählen
mkfifo fifo.my
touch out.my
passwd > out.my 2> out.my < fifo.my & echo $!
Die Ausgabe von
Code: Alles auswählen
jobs
Code: Alles auswählen
[1]+ Läuft passwd > out.my 2> out.my < fifo.my &
Code: Alles auswählen
cat out.my
Wenn ich hier ein
Code: Alles auswählen
echo '' > fifo.my
Code: Alles auswählen
cat out.my
Code: Alles auswählen
Ändern des Passworts für kvogelsa.
hler beim Ändern des Authentifizierungstoken
passwd: Passwort nicht geändert
DIe korrekte Ausgabe müsste lauten
Code: Alles auswählen
Ändern des Passworts für kvogelsa.
(aktuelles) UNIX-Passwort:
passwd: Fehler beim Ändern des Authentifizierungstoken
passwd: Passwort nicht geändert
2. Grundvariante (geht)
Wie gehabt die Vorbereitung
Code: Alles auswählen
mkfifo fifo.my
touch out.my
passwd > out.my 2> out.my < fifo.my & echo $!
aber zusätzlich wird die pipe offen gehalten durch vorheriges
Code: Alles auswählen
cat > fifo.my &
Code: Alles auswählen
mkfifo fifo.my
touch out.my
cat > fifo.my &
passwd > out.my 2> out.my < fifo.my & echo $!
Die Reihenfolge von cat und passwd ist entscheidend.
Code: Alles auswählen
jobs
Code: Alles auswählen
[1]+ Angehalten cat > fifo.my
[2]- Läuft passwd > out.my 2> out.my < fifo.my &
Code: Alles auswählen
cat out.my
Code: Alles auswählen
(aktuelles) UNIX-Passwort:
Code: Alles auswählen
echo 'passwortstring' > fifo.my
Code: Alles auswählen
cat out.my
Code: Alles auswählen
(aktuelles) UNIX-Passwort: Geben Sie ein neues UNIX-Passwort ein:
Folgerichtig ergibt nun ein
Code: Alles auswählen
echo 'passwortstringneu' > fifo.my
Code: Alles auswählen
cat out.my
(aktuelles) UNIX-Passwort: Geben Sie ein neues UNIX-Passwort ein: Geben Sie das neue UNIX-Passwort erneut ein:
Code: Alles auswählen
echo 'passwortstringneu' > fifo.my
Code: Alles auswählen
cat out.my
Ändern des Passworts für kvogelsa.
Ändern des Passworts für kvogelsa.
Ändern des Passworts für kvogelsa.
passwd: Passwort erfolgreich geändert
Code: Alles auswählen
jobs
Code: Alles auswählen
[1]+ Angehalten cat > fifo.my
Aufgrund dieses Cat-Prozesses kann ich den passwd Prozess wieder wie gehabt in den Hintergrundschieben, der Cat-Prozess hält die Pipe offen.
3. Script-Szenario (geht nicht)
Das ganze soll (in ferner Zukunft...) über den Apache angestoßen werden. Deshalb kann
Code: Alles auswählen
cat > fifo.my &
Code: Alles auswählen
#!/bin/bash
mkfifo fifo.my
touch out.my
cat > fifo.my & PID=$!
echo $PID
Code: Alles auswählen
bash create_bg.sh
ABER: Unter
Code: Alles auswählen
jobs
Der Prozess ist aber vorhanden:
Code: Alles auswählen
ps -elf | grep 4916
1 S kvogelsa 4916 1 0 80 0 - 4498 pipe_w 13:16 pts/0 00:00:00 bash create_bg.sh
Code: Alles auswählen
passwd > out.my 2> out.my < fifo.my & echo $!
Nun also die Frage: Wie halte ich die pipe offen von einem Skript aus?
(Ich hoffe, der Beitrag ist nicht zuu lang...)