Ist es sicher, leiten Sie die Ausgabe von mehreren parallelen Prozessen, die zu einer Datei mit >>?
Ich bin Schaben Daten aus dem web, und ich habe mehrere Prozesse von meinen Spachtel parallel laufen.
Möchte ich die Leistung von jeder dieser Prozesse, um am Ende in der gleichen Datei. Solange der Linien des Textes erhalten bleiben und nicht vermischt mit einander, die Reihenfolge der Zeilen spielt keine Rolle. In UNIX kann ich nur leiten Sie die Ausgabe von jedem Prozess auf die gleiche Datei mit dem >> operator?
- InRe: in der Nähe Stimmen. So wie ich es sehe "Ist der Betrieb Foo sicher für die gleichzeitige Verwendung in der Sprache Bar?" ist ein Programmier-Fragen jedes mal. In diesem Fall Foo Rohrleitungen Eingabe für std[in,err] und die Bar sind einige unix-shell. Muss sagen, ich denke, es sollte bleiben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht. Es ist nicht garantiert, dass die Linien erhalten bleiben. Sie können sich vermischt.
Vom suchen basierend auf liori ' s Antwort fand ich diese:
Also Zeilen, die länger als {PIPE_BUF} bytes sind nicht unbedingt intakt bleiben.
Einer evtl. interessante Sache, die Sie tun können, ist gnu parallel: http://www.gnu.org/s/parallel/ Zum Beispiel, wenn Sie wurden Sie spidering den Standorten:
konnten Sie so etwas tun
und der Ausgang ist gepuffert und parallel, weil die -k-option zurückgegeben, um Sie in der Reihenfolge der site-Liste oben. Ein echtes Beispiel (im Grunde kopiert aus dem 2. parallel screencast):
Sowieso, ymmv
In der Regel, Nein.
Auf Linux möglich sein könnte, solange zwei Bedingungen erfüllt sind: jede Zeile ist geschrieben in einem Betrieb, und die Linie ist nicht mehr als PIPE_SIZE (in der Regel die gleichen wie PAGE_SIZE, in der Regel 4096). Aber... ich würde mich nicht drauf verlassen; dieses Verhalten könnte sich ändern.
Ist es besser, eine Art von real-logging-Mechanismus, wie syslog.
Temporäre Dateien verwenden und verketten Sie zusammen. Es ist die einzige sichere Weise, das zu tun, was Sie tun möchten, und es wird (vermutlich) vernachlässigbar sein performance-Verlust, der Weg. Wenn die performance ist wirklich ein problem, versuchen Sie sicherstellen, dass Ihr /tmp-Verzeichnis ist ein RAM-basiertes Dateisystem und setzen Ihre temporären Dateien dort. So werden die temporären Dateien im RAM gespeichert und nicht auf der Festplatte, so dass das Lesen/schreiben ist nahezu sofortige.
Sie benötigen, um sicherzustellen, dass Sie schreiben ganze Zeilen in eine einzige schreib-Operationen (also, wenn Sie mit irgendeiner form der stdio, die Sie brauchen, um es für die Linie, die Pufferung für mindestens die Länge der längsten Zeile, die Sie ausgeben können.) Da die shell verwendet O_APPEND für die >> Umleitung dann alle Ihr schreibt dann automatisch "anfügen", um die Datei ohne weitere Aktion auf Ihrem Teil.
Definitiv Nein, ich hatte eine log-management-Skript, wo ich davon ausgegangen, gearbeitet, und es hat funktioniert, bis ich es verschoben, um eine unter-Last-Produktion-server. Kein guter Tag... Aber im Grunde ist Sie am Ende mit manchmal völlig Durcheinander von Linien.
Wenn ich versuche zu erfassen, aus mehreren Quellen, es ist viel einfacher (und leichter zu Debuggen), mit einem multiple-Datei "paper trails" und wenn ich eine über-all log-Datei, verketten, basierend auf Zeitstempel (Sie sind mit Zeit-Stempel, oder?) oder wie liori sagte, syslog.
Kurz, Nein.
>>
nicht respektiert, mehrere Prozesse.Neben der Idee der Verwendung von temporären Dateien, Sie können auch eine Art von Aggregation, wenn auch Sie würden noch brauchen, um sicherzustellen, dass Ihr schreibt, sind atomar.
Denke Apache2 mit dem Pipe-Protokollierung (mit etwas, das wie die sich auf dem anderen Ende der Leitung, wenn Sie das Gefühl ehrgeizig). Das ist der Ansatz, den es braucht, mehrere threads/Prozesse teilen sich eine einzige Login-Prozess.
Wie oben erwähnt, es ist eigentlich ein hack, aber funktioniert ziemlich gut =)
gleiche mit '>>' :
und mit exec auf dem letzten speichern Sie einen Prozess: