Szukaj…


Składnia

  • child_process.exec (polecenie [, opcje] [, oddzwonienie])
  • child_process.execFile (plik [, argumenty] [, opcje] [, wywołanie zwrotne])
  • child_process.fork (modulePath [, args] [, opcje])
  • child_process.spawn (polecenie [, argumenty] [, opcje])
  • child_process.execFileSync (plik [, argumenty] [, opcje])
  • child_process.execSync (polecenie [, opcje])
  • child_process.spawnSync (polecenie [, argumenty] [, opcje])

Uwagi

Podczas obsługi procesów potomnych wszystkie metody asynchroniczne zwracają instancję ChildProcess , a wszystkie wersje synchroniczne zwracają dane wyjściowe tego, co zostało uruchomione. Podobnie jak inne operacje synchroniczne w Node.js, jeśli wystąpi błąd, zostanie zgłoszony błąd.

Spawning nowy proces do wykonania polecenia

Aby spawnować nowy proces, w którym potrzebujesz niebuforowanych danych wyjściowych (np. Długotrwałe procesy, które mogą drukować dane wyjściowe przez pewien czas zamiast drukowania i wychodzenia natychmiast), użyj child_process.spawn() .

Ta metoda odradza nowy proces za pomocą podanego polecenia i tablicy argumentów. ChildProcess wartość jest instancją ChildProcess , która z kolei zapewnia właściwości stdout i stderr . Oba strumienie są instancjami stream.Readable .

Poniższy kod jest równoważny z użyciem polecenia ls -lh /usr .

const spawn = require('child_process').spawn;
const ls = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.log(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});

Kolejne przykładowe polecenie:

zip -0vr "archive" ./image.png

Może być zapisany jako:

spawn('zip', ['-0vr', '"archive"', './image.png']);

Odradzanie powłoki w celu wykonania polecenia

Aby uruchomić polecenie w powłoce, w której wymagane jest zbuforowane wyjście (tj. Nie jest to strumień), użyj child_process.exec . Na przykład, jeśli chcesz uruchomić polecenie cat *.js file | wc -l , bez opcji, które wyglądałyby tak:

const exec = require('child_process').exec;
exec('cat *.js file | wc -l', (err, stdout, stderr) => {
  if (err) {
    console.error(`exec error: ${err}`);
    return;
  }

  console.log(`stdout: ${stdout}`);
  console.log(`stderr: ${stderr}`);
});

Funkcja akceptuje maksymalnie trzy parametry:

child_process.exec(command[, options][, callback]);

Parametr polecenia jest łańcuchem i jest wymagany, a obiekt opcji i wywołanie zwrotne są opcjonalne. Jeśli nie zostanie podany żaden obiekt opcji, to exec użyje domyślnie:

{
  encoding: 'utf8',
  timeout: 0,
  maxBuffer: 200*1024,
  killSignal: 'SIGTERM',
  cwd: null,
  env: null
}

Obiekt options obsługuje również parametr shell , którym jest domyślnie /bin/sh w systemie UNIX i cmd.exe w systemie Windows, opcja uid do ustawiania tożsamości użytkownika procesu oraz opcja gid dla tożsamości grupy.

Wywołanie zwrotne, które jest wywoływane po zakończeniu wykonywania polecenia, jest wywoływane z trzema argumentami (err, stdout, stderr) . Jeśli polecenie zostanie wykonane pomyślnie, err będzie miało null , w przeciwnym razie będzie to wystąpienie Error , przy czym err.code będzie kodem zakończenia procesu, a err.signal będzie sygnałem wysłanym w celu jego zakończenia.

Argumenty stdout i stderr są danymi wyjściowymi polecenia. Jest dekodowany z kodowaniem określonym w obiekcie opcji (domyślnie: string ), ale w przeciwnym razie może zostać zwrócony jako obiekt Buffer .

Istnieje również synchroniczna wersja exec , którą jest execSync . Wersja synchroniczna nie ChildProcess oddzwonienia i zwraca stdout zamiast instancji ChildProcess . Jeśli wersja synchroniczny napotka błąd, będzie rzucać i zatrzymać swój program. To wygląda tak:

const execSync = require('child_process').execSync;
const stdout = execSync('cat *.js file | wc -l');
console.log(`stdout: ${stdout}`);

Spawning proces do uruchomienia pliku wykonywalnego

Jeśli chcesz uruchomić plik, taki jak plik wykonywalny, użyj child_process.execFile . Zamiast child_process.exec powłokę, taką jak child_process.exec , bezpośrednio utworzy nowy proces, który jest nieco bardziej wydajny niż uruchomienie polecenia. Z funkcji można korzystać w następujący sposób:

const execFile = require('child_process').execFile;
const child = execFile('node', ['--version'], (err, stdout, stderr) => {
  if (err) {
    throw err;
  }

  console.log(stdout);
});

W przeciwieństwie do child_process.exec , ta funkcja zaakceptuje maksymalnie cztery parametry, przy czym drugi parametr jest tablicą argumentów, które chcesz podać child_process.exec wykonywalnemu:

child_process.execFile(file[, args][, options][, callback]);

W przeciwnym razie opcje i format wywołania zwrotnego są w przeciwnym razie identyczne z child_process.exec . To samo dotyczy synchronicznej wersji funkcji:

const execFileSync = require('child_process').execFileSync;
const stdout = execFileSync('node', ['--version']);
console.log(stdout);


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow