Alt Süreç Oluşturma
Kavramlar
- Deno, Deno.Command aracılığıyla bir alt süreç başlatabilir.
- Bir alt süreç başlatmak için
--allow-run
izni gereklidir. - Başlatılan alt süreçler güvenlik kumandasında çalışmaz.
- Alt süreçle, stdin, stdout ve stderr akışları aracılığıyla iletişim kurulur.
Basit örnek
ipucu
Bu örnek, komut satırından echo "Hello from Deno!"
çalıştırmanın eşdeğeridir.
subprocess_simple.ts
// alt süreç oluşturmak için kullanılan komutu tanımla
const command = new Deno.Command("echo", {
args: [
"Hello from Deno!",
],
});
// alt süreci oluştur ve çıktıyı topla
const { code, stdout, stderr } = await command.output();
console.assert(code === 0);
console.log(new TextDecoder().decode(stdout));
console.log(new TextDecoder().decode(stderr));
Çalıştır:
$ deno run --allow-run=echo ./subprocess_simple.ts
Hello from Deno!
Güvenlik
tehlike
Bir alt süreç oluşturmak için --allow-run
izni gereklidir. Alt süreçlerin Deno kumandasında çalışmadığını ve dolayısıyla komutu komut satırından kendiniz çalıştırıyormuş gibi aynı izne sahip olduğunu unutmayın.
Alt süreçlerle iletişim
Varsayılan olarak Deno.Command()
kullandığınızda alt süreç, ana sürecin stdin
, stdout
ve stderr
'ı devralır. Başlatılan bir alt süreçle iletişim kurmak istiyorsanız "piped"
seçeneğini kullanmalısınız.
Dosyalara yönlendirme
bilgi
Bu örnek, bash'de yes &> ./process_output
çalıştırmanın eşdeğeridir.
subprocess_piping_to_files.ts
import {
mergeReadableStreams,
} from "jsr:@std/streams@1.0.0-rc.4/merge-readable-streams";
// süreci bağlamak için dosya oluştur
const file = await Deno.open("./process_output.txt", {
read: true,
write: true,
create: true,
});
// süreci başlat
const command = new Deno.Command("yes", {
stdout: "piped",
stderr: "piped",
});
const process = command.spawn();
// dosyaya göndermenin yanı sıra stdout ve stderr'yi birleştirme örneği
const joined = mergeReadableStreams(
process.stdout,
process.stderr,
);
// süreç kapandığında/öldüğünde çözülen bir promis döner
joined.pipeTo(file.writable).then(() => console.log("pipe join done"));
// süreç "yes" manuel olarak durdurulmalı, kendi kendine sonlanmaz
setTimeout(() => {
process.kill();
}, 100);
Çalıştır:
$ deno run --allow-run=yes --allow-read=. --allow-write=. ./subprocess_piping_to_file.ts