Используйте дочерний процесс.execSync, но сохранить вывод в консоли



Я хотел бы использовать execSync метод, который был добавлен в NodeJS 0.12, но все еще имеет выход в окне консоли, из которого я запустил скрипт узла.



например, если я запускаю скрипт NodeJS, который имеет следующую строку, я хотел бы видеть полный вывод команды rsync "live" внутри консоли:



require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"');


Я понимаю, что execSync возвращает вывод команды и что я мог бы распечатать это на консоль после выполнения, но таким образом у меня нет " live" выход...

503   3  

3 ответов:

вы можете пройти родители stdio к дочернему процессу если это то, что вы хотите:

require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"', {stdio:[0,1,2]});

Если вы не перенаправляете stdout и stderr, как предполагает принятый ответ, это невозможно с помощью execSync или spawnSync. Без перенаправления stdout и stderr эти команды возвращают только stdout и stderr, когда команда завершена.

чтобы сделать это без перенаправления stdout и stderr, вам нужно будет использовать spawn для этого, но это довольно прямолинейно:

var spawn = require('child_process').spawn;

//kick off process of listing files
var child = spawn('ls', ['-l', '/']);

//spit stdout to screen
child.stdout.on('data', function (data) {   process.stdout.write(data.toString());  });

//spit stderr to screen
child.stderr.on('data', function (data) {   process.stdout.write(data.toString());  });

child.on('close', function (code) { 
    console.log("Finished with code " + code);
});

я использовал команду ls, которая рекурсивно перечисляет файлы, чтобы вы могли проверить ее быстро. Spawn принимает в качестве первого аргумента имя исполняемого файла, который вы пытаетесь запустить, и в качестве второго аргумента он принимает массив строк, представляющих каждый параметр, который вы хотите передать в этот исполняемый файл.

однако, если вы настроены на использование execSync и по какой-то причине не можете перенаправить stdout или stderr, вы можете открыть другой терминал, например xterm, и передать ему команду:

var execSync = require('child_process').execSync;

execSync("xterm -title RecursiveFileListing -e ls -latkR /");

Это позволит вам увидеть, что ваша команда делает в новый терминал а еще есть синхронный вызов.

вы можете просто использовать .toString().

var result = require('child_process').execSync('rsync -avAXz --info=progress2 "/src" "/dest"').toString();
console.log(result);

Это было проверено на узле v8.5.0, Я не уверен в предыдущих версиях. Согласно @etov, это не работает на v6.3.1 - Я не уверен, что между ними.

Comments

    Ничего не найдено.