Ich muss ein Bash-Skript von der nodejs-App ausführen. Normalerweise würde ich etwas wie folgt aus:So führen Sie das Shell-Skript ordnungsgemäß aus: nodejs
var childProcess = require('child_process');
childProcess.execFile('./test.sh', function (error, stdout, stderr) {
console.log(error, stdout, stderr);
})
Aber ich vor kurzem lief in ein Bash-Skript, das nie beendet, wenn es so ausgeführt wurde. Dies ist ein minimales Beispiel, das das Problem reproduziert:
#!/bin/bash
LC_CTYPE=C cat /dev/urandom | tr -dc "a-zA-Z0-9" | fold -w 8 | head -n 1
LC_CTYPE=C
- dietr
zwingen, alles als ASCII-Zeichentr -dc "a-zA-Z0-9" < /dev/urandom
zu interpretieren - lesen Pseudo-Zufalls-Bytes, verwirft alles außera-zA-Z0-9
fold -w 8
- wickeln Ausgang in Zeilen 8 Zeichen langhead -n 1
- lesen Sie die erste Zeile (8 Zeichen)
Wenn vom Terminal ausgeführt funktioniert es gut und es sofort beendet:
# ./test.sh
0J5hsGeh
Wenn die oben ausgeführt unter Verwendung von NodeJS Skript hängt er einfach:
# node test.js
Es scheint, dass die head -n 1
ist bereits beendet, aber die cat /dev/urandom
läuft noch.
Frage: Wie führt man das Skript von Nodejs, so dass es nicht hängt?
Env:
- OS:
Ubuntu 16.04
- NodeJS Version:
v6.11.2
Versuchen Sie, das Ende der Bash-Skript 'exit' Befehl hinzufügen –
in Ihrem shebang Set -x oder es über bash -x ausführen, werden wir ein klareres Bild von dem, was –
Jungen passiert, vielen Dank für Vorschläge. Sie helfen jedoch nicht. 'exit' am Ende des Skripts tut nichts und in diesem Fall wird es nicht einmal ausgeführt, weil die vorherige Zeile niemals endet.Das '-x' hilft auch nicht, weil das Skript nie beendet wird, so dass die von' -x' erzeugte Ausgabe nicht gedruckt wird. Wie auch immer, ich versuche nicht, das Bash-Skript zu debuggen. Ich versuche herauszufinden, warum die Ausführung durch nodejs einen Unterschied macht. – Prvaak