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);