Wie erstelle ich einen neuen Hintergrundprozess in einer KSH-Schleife während des Lesens?

3919
yael

Das folgende Testskript hat ein Problem. Wenn ich die Zeile (sleep 5 ) &im Skript hinzufüge, liest die Schleife "while read" nicht alle Zeilen aus der Datei, sondern druckt nur die erste Zeile.

Wenn ich jedoch das ( sleep 5 ) &aus dem Skript entferne, druckt das Skript alle Zeilen wie in der Datei definiert.

Warum ist das der ( sleep 5 ) &Grund?

Und wie löst man das Problem? Ich möchte sleepin der while-Schleife einen neuen Prozess erstellen (für den nur ein Beispiel ist):

$ more test  #!/bin/ksh  while read -r line ; do echo Read a line: echo $line  ( sleep 5 )& RESULT=$! echo Started background sleep with process id $RESULT  sleep 1 echo Slept for a second  kill $RESULT  echo Killed background sleep with process id $RESULT done < file echo Completed  

Unter meinem Linux, wenn folgende Inhalte verwendet werden file:

$ more file  123 aaa  234 bbb  556 ccc 

... Laufen ./testgibt mir nur:

Lesen Sie eine Zeile: 123 aaa Gestarteter Hintergrundschlaf mit Prozess-ID 4181 Für eine Sekunde geschlafen  Getöteter Hintergrundschlaf mit Prozess-ID 4181 Abgeschlossen
0
Diese Frage ist wahrscheinlich besser für den Stapelüberlauf geeignet. Ihre Frage wird dort automatisch migriert. Hello71 vor 14 Jahren 0
Sie wurden mehrmals gebeten, Ihre Beiträge richtig zu formatieren. Verwenden Sie die Taste `101010` oder ziehen Sie jede Zeile Code um vier Leerzeichen ein. Außerdem müssen Sie einige Antworten als akzeptiert markieren. Dennis Williamson vor 14 Jahren 2
Es funktioniert gut für mich. Dennis Williamson vor 14 Jahren 2
Ich habe gerade Ihre Bearbeitung wieder rückgängig gemacht, Yael, lassen Sie die von anderen vorgenommenen Bearbeitungen nicht rückgängig machen, wenn dies die Formatierung verbessert. Es gilt als unhöflich, störrisch und kindisch. Wenn Sie nicht mögen, dass Leute Ihre Beiträge bearbeiten, ist diese Site möglicherweise nicht für Sie. BloodPhilia vor 14 Jahren 3
Dennis hast du es überprüft yael vor 14 Jahren 0
Dennis hast du das Skript überprüft? yael vor 14 Jahren 0
Dennis hat das Skript wahrscheinlich so verwendet, wie es jetzt in Ihrem Beitrag ist. Ich schlage vor, Sie versuchen es. BloodPhilia vor 14 Jahren 0
Hallo nochmal, dieses Skript, während ich das erste Mal editiere, ist dasselbe wie jetzt und das Problem besteht immer noch, Yael yael vor 14 Jahren 0
"Wenn ich das (schlaf 5) & aus dem Skript entferne", nehme ich an, dass Sie auch das "töten" dann entfernen? Arjan vor 14 Jahren 0
Nein das (sleep 5) & muss im Skript stehen, das Problem ist, warum die Schleife nicht fortgesetzt wird, wenn ich das (sleep 5) & setze? Yael yael vor 14 Jahren 0
Das obige Skript funktioniert gut für mich (auf einem Mac) und für Dennis. Angenommen, dies ist nur eine Beispielversion von etwas Nützlicherem, haben Sie tatsächlich dasselbe Skript selbst ausgeführt? Arjan vor 14 Jahren 0
Und was "warum die Schleife nicht weiterläuft" - natürlich schläft die Schleife * aufgrund des "Schlafes 1" für eine Sekunde. Aber danach geht es auf meinem Computer weiter. Arjan vor 14 Jahren 0
Ja, wenn ich dieses Skript ausführe, druckt das Skript nur die erste Zeile: 123 aaa Ziel ist es, alle Zeilen in der Datei yael zu drucken yael vor 14 Jahren 0
Hast du an LINUX gearbeitet? yael vor 14 Jahren 0
Ist * dein *? Sie geben uns diese Informationen nicht ... :-( (Wie ich schrieb: Ich habe auf einem Mac getestet, auf dem auch KSH integriert ist.) Arjan vor 14 Jahren 1
Meine Maschine ist LINUX Yael yael vor 14 Jahren 0
Ich habe eine Ubuntu 9.10-Maschine gestartet, auf der jedoch kein KSH installiert ist. Die Verwendung der Standard-Bash-Shell gibt mir auch auf diesem Ubuntu-Rechner keine Probleme. Ungerade. Arjan vor 14 Jahren 1
nach deinem letzten Testlauf habe ich und du hast die gleichen Ergebnisse yael vor 14 Jahren 0
Ich habe es auf Ubuntu 9.10 mit ksh 93 getestet und es funktioniert gut. Ich habe sogar die Datendatei so geändert, dass DOS-Zeilenenden mit `unix2dos` verwendet werden, um zu sehen, ob so etwas Ihr Problem sein könnte. Es hat immer noch gut funktioniert (beide Versionen Ihres Skripts). Die Subshell um "sleep 5" ist übrigens unnötig, aber ich bezweifle, dass dies die Ursache Ihres Problems ist. Sie können einfach "Schlaf 5 &" tun Dennis Williamson vor 14 Jahren 1
@yeal, * nach deinem letzten Testlauf habe ich und du hast die gleichen Ergebnisse * - nein, ich bekomme * alle * Zeilen (genau wie Dennis). Ich habe * Ihre * Ergebnisse in Ihre Frage kopiert, natürlich nicht meine. Bearbeiten Sie die Frage so, dass sie auch die Version des Skripts enthält, in der alle Zeilen für Sie gedruckt werden. (Also: die Version ohne "(sleep 5) &" und was auch immer Sie sonst entfernt haben.) Arjan vor 14 Jahren 1
(Und siehe [Wie funktionieren Kommentarantworten?] (Http://meta.stackexchange.com/questions/43019/how-do-comment-replies-work)) Arjan vor 14 Jahren 1
(sleep 5) &, weil es nur das Orig-Skript ausführt, unterscheidet es sich wie: (sleep 20; sed ........; ...) & yael vor 14 Jahren 0
so endlich haben wir keine Lösung - (: yael vor 14 Jahren 0
1) Was gibt Ihnen "ksh -m. / Test"? 2) Ich bezweifle, dass es hilft, aber versuchen Sie "#! / Bin / bash" anstelle von "#! / Bin / ksh". 3) Führen Sie "ksh -v. / Test" aus, um zu sehen, ob Ihnen dies weitere Details gibt. 4) Welche Version von KSH verwenden Sie? Siehe `ksh 'print $ {. Sh.version}'` 5) Welches Linux verwenden Sie? Siehe auch "uname -v". 6) Da dieser ganze Beitrag ziemlich verwirrend ist, zeigen Sie uns bitte die abgespeckte Version des Skripts, das * für Sie * funktioniert *. (Also, wie ich schon zweimal gefragt habe: die Version ohne `(sleep 5) &`.) Arjan vor 14 Jahren 1

1 Antwort auf die Frage

1
Gilles

Aus dem Ksh-Änderungsprotokoll für ksh93s:

06-10-23 Ein Fehler, bei dem der Wert $!von einem Hintergrundjob beeinflusst wurde, der von einer Subshell gestartet wurde, wurde behoben.

Wenn Ihre Version von ksh älter ist (Sie sollten die Version in Ihrer Frage erwähnen!), Könnten Sie diesen Fehler beobachten.