Ana içeriğe geç

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