Node.js
Wykonywanie plików lub poleceń za pomocą procesów potomnych
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);