Einführung in Node.js, Folge 23: Child-Prozesse
In zahlreichen Anwendungen besteht die Anforderung, andere Anwendungen als Child-Prozesse zu starten. Zu dem Zweck enthält Node.js das Modul child_process. Allerdings ist Vorsicht geboten, denn das Modul führt rasch zu plattformabhängigem Code. Wie lässt sich das Problem anders lösen?
- Golo Roden
In zahlreichen Anwendungen besteht die Anforderung, andere Anwendungen als Child-Prozesse zu starten. Zu dem Zweck enthält Node.js das Modul child_process. Allerdings ist Vorsicht geboten, denn das Modul führt rasch zu plattformabhängigem Code. Wie lässt sich das Problem anders lösen?
Das Modul child_process von Node.js enthält zahlreiche Funktionen, um Child-Prozesse zu starten und zu überwachen. Den Kern des Moduls stellt die Funktion spawn dar, die von allen übrigen Funktionen als interne Basis verwendet wird.
Einführung in Node.js
- Folge 1: Node.js installieren
- Folge 2: Erste Schritte
- Folge 3: Module verwenden
- Folge 4: Web-APIs entwickeln
- Folge 5: Middleware
- Folge 6: Auf das Dateisystem zugreifen
- Folge 7: Callbacks verstehen
- Folge 8: Events auslösen und verarbeiten
- Folge 9: Datenbanken ansprechen (NoSQL)
- Folge 10: Praxisbeispiel
- Folge 11: Code analysieren
- Folge 12: Unit-Tests schreiben
- Folge 13: HTTPS und HTTP/2
- Folge 14: Websockets
- Folge 15: Integration-Tests schreiben
- Folge 16: Node.js und Docker
- Folge 17: Streams verwenden
- Folge 18: Eigene Streams schreiben
- Folge 19: Dokumentation schreiben
- Folge 20: Praxisbeispiel
- Folge 21: Daten verschlüsseln
- Folge 22: CLI-Anwendungen
- Folge 23: Child-Prozesse
Diese übrigen Funktionen, exec und execFile, ermöglichen ebenfalls das Ausführen eines Child-Prozesses, verwenden anstelle von Streams jedoch einen Callback, um die Ergebnisse des Aufrufs zurückzugeben. Welcher Funktion wann der Vorzug zu geben ist, hängt von der konkreten Aufgabe und den gegebenen Umständen ab. Generell lässt sich aber sagen, dass execFile ein bisschen schneller ist, exec dagegen aber die bessere Kompatibilität bietet.
Unabhängig davon, für welche der genannten Funktionen man sich entscheidet, enthält das Modul auch deren synchrone Pendants, spawnSync, execSync und execFileSync. Im Gegensatz zu den asynchronen Varianten blockieren sie den weiteren Ablauf, bis der Child-Prozess beendet wurde. Darüber hinaus kennt das Modul außerdem auch die fork-Funktion, mit der sich eine neue Instanz des laufenden Node.js-Prozesses erzeugen lässt, um darüber eine weitere Node.js-Anwendung auszuführen.
Der größte Nachteil all dieser Funktionen ist, dass sie rasch zu plattformabhängigem Code führen, da die aufzurufenden Anwendungen nur auf bestimmten Betriebssystemen zur Verfügung stehen, Parameter anders zu formatieren sind oder Verzeichnisse unterschiedlich angegeben werden.
Abhilfe schafft – zumindest zu einem gewissen Grad – das npm-Modul ShellJS, das die verschiedenen Unix-Kommandos plattformunabhängig zur Verfügung stellt. Auf dem Weg lassen sich beispielsweise Befehle wie mkdir, rm oder cp auf die übliche Art ausführen, unabhängig vom zugrundeliegenden Betriebssystem.
Wie das alles funktioniert und worauf es dabei zu achten gilt, zeigt das folgende Video:
Empfohlener redaktioneller Inhalt
Mit Ihrer Zustimmmung wird hier eine Vimeo-Video (Vimeo LLC) geladen.
Ich bin damit einverstanden, dass mir externe Inhalte angezeigt werden. Damit können personenbezogene Daten an Drittplattformen (Vimeo LLC) übermittelt werden. Mehr dazu in unserer Datenschutzerklärung.
tl;dr: Node.js enthält das child_process-Modul, um Child-Prozesse zu starten. Es bietet prinzipiell alles, was das Herz begehrt, ist aber teilweise unnötig umständlich. Abhilfe schafft das Modul ShellJS, das außerdem für eine verbesserte Plattformunabhängigkeit sorgt. ()