node:os modülü, uygulamanın çalıştığı işletim sistemi ve makine hakkında bilgi veren fonksiyonlar sunar: os.platform() ve os.type() sistemi, os.cpus() ve os.availableParallelism() işlemci kapasitesini, os.totalmem() ve os.freemem() belleği, os.homedir() ve os.tmpdir() kullanıcı ve geçici klasörleri, os.EOL satır sonu karakterini verir. Kaç tane işçi (worker) başlatacağınıza karar verirken belgelerin önerisi os.cpus().length değil, os.availableParallelism() kullanmaktır.

Bu yazıda modülün bütün fonksiyonlarını, Windows ve Linux arasındaki farklarıyla birlikte ele alıyoruz. Örnekler Windows 11 üzerinde Node.js v26.13.0 ile çalıştırıldı; bu modülün çıktıları makineye özgü olduğu için bellek miktarı, işlemci modeli, kullanıcı adı ve ağ adresi gibi değerleri yazdırmak yerine çoğu yerde değerin türünü, anahtarlarını ya da bir karşılaştırmanın sonucunu gösterdik. Sizin makinenizde sayılar farklı olacaktır; yapı ve platform farkları ise belgelerde anlatıldığı gibidir.

Platform ve mimari bilgisi

Platform ve mimari bilgisi

os.platform(), Node.js ikilisinin hangi işletim sistemi için derlendiğini söyler. Belgelerdeki olası değerler 'aix', 'darwin', 'freebsd', 'linux', 'openbsd', 'sunos' ve 'win32'; Android üzerinde derlenmiş Node için deneysel olarak 'android' da dönebilir. Değer derleme zamanında belirlenir ve process.platform ile aynıdır. 64 bit Windows'ta da 'win32' döner; aşağıdaki x64 makinede de sonuç buydu.os.type() ise uname(3) ile dönen sistem adını verir: Linux'ta 'Linux', macOS'ta 'Darwin', Windows'ta 'Windows_NT'. os.arch() derleme mimarisini ('x64', 'arm64' gibi) ve process.arch ile aynı değeri, os.endianness() da bayt sırasını ('LE' veya 'BE') döndürür.

javascript
// o1.mjs  (Windows 11, x64)
import os from 'node:os';
console.log(os.platform(), os.type(), os.arch(), os.endianness());
console.log(JSON.stringify(os.EOL), JSON.stringify(os.devNull));
console.log(os.availableParallelism() > 0, os.cpus().length >= 1);
console.log(Object.keys(os.cpus()[0]));
console.log(Object.keys(os.cpus()[0].times));
console.log(os.loadavg());
console.log(typeof os.totalmem(), os.freemem() <= os.totalmem());

// çıktı: win32 Windows_NT x64 LE
// çıktı: "\r\n" "\\\\.\\nul"
// çıktı: true true
// çıktı: [ 'model', 'speed', 'times' ]
// çıktı: [ 'user', 'nice', 'sys', 'idle', 'irq' ]
// çıktı: [ 0, 0, 0 ]
// çıktı: number true

os.release() işletim sistemi sürümünü, os.version() çekirdek sürümünü tanımlayan bir dize döndürür; ikisi de POSIX'te uname(3), Windows'ta sistem API'leri üzerinden okunur. os.machine() ise x86_64, aarch64 gibi makine türünü verir. Platforma göre farklı davranan bir kod yazacaksanız karşılaştırmayı os.type() metni üzerinden değil, belgelerde sabit değerleri listelenmiş os.platform() ya da process.platform üzerinden yapın.

Satır sonu ve null aygıtı: os.EOL, os.devNull

os.EOL işletim sisteminin satır sonu işaretidir: POSIX'te \n, Windows'ta \r\n. Yukarıdaki çıktıda JSON.stringify ile görünür hale getirdik. Bir rapor dosyasını yerel araçlarda (örneğin Windows'taki Not Defteri) açılacak biçimde yazıyorsanız satırları os.EOL ile birleştirebilirsiniz. Ama ağ protokolleri, JSON satırları ya da Linux sunucuya gönderilecek dosyalar gibi biçimi önceden belli olan çıktılarda sabit bir değer kullanmak daha doğrudur; aksi halde aynı kod Windows'ta farklı bir dosya üretir. Gelen metni satırlara bölerken de split(os.EOL) yerine split(/\r?\n/) gibi her iki biçimi kabul eden bir ifade kullanın, çünkü dosyanın hangi sistemde yazıldığını bilemezsiniz.

os.devNull null aygıtının yoludur: Windows'ta \\.\nul, POSIX'te /dev/null. YAML kaydına göre v16.3.0 ve v14.18.0 ile geldi. Bir alt süreç çıktısını atmak ya da yazılan her şeyi yok sayan bir dosya hedefi gerektiğinde platforma göre if yazmak yerine bu sabiti kullanabilirsiniz.

İşlemci: os.cpus() ve os.availableParallelism()

İşlemci: os.cpus() ve os.availableParallelism()

os.cpus() her mantıksal işlemci çekirdeği için bir nesne döndürür. Nesnede model, MHz cinsinden speed ve çekirdeğin farklı modlarda geçirdiği milisaniyeleri tutan times alanı bulunur (user, nice, sys, idle, irq). Belgelere göre nice değerleri yalnızca POSIX'e özgüdür ve Windows'ta her zaman 0'dır; işlemci bilgisi alınamazsa (örneğin /proc dosya sistemi yoksa) dizi boş döner. times değerleri birikimli olduğu için anlık işlemci kullanımını bulmak isterseniz iki ölçüm arasındaki farkı almanız gerekir.

En önemli uyarı şu: belgeler os.cpus().length değerinin bir uygulamanın kullanabileceği paralelliği hesaplamak için kullanılmaması gerektiğini, bunun yerine os.availableParallelism() kullanılmasını açıkça söylüyor. Bu fonksiyon libuv'nin uv_available_parallelism() fonksiyonunun ince bir sarmalayıcısıdır, programın varsayılan olarak kullanması gereken paralellik miktarı için bir tahmin döndürür ve her zaman sıfırdan büyüktür. YAML kaydına göre v19.4.0 ve v18.14.0 ile geldi. Worker thread havuzu kurarken ya da süreç sayısını belirlerken bu değeri temel alın; cluster ve PM2 ile çok süreçli çalıştırmanın ayrıntıları cluster ve PM2 yazısında anlatılıyor.

javascript
// o5.mjs
import os from 'node:os';

const gb = (bayt) => (bayt / 1024 ** 3).toFixed(1) + ' GB';

function sistemOzeti() {
  return {
    platform: os.platform(),
    tur: os.type(),
    mimari: os.arch(),
    paralellik: os.availableParallelism(),
    toplamBellek: gb(os.totalmem()),
    bosBellekYuzde: Math.round((os.freemem() / os.totalmem()) * 100),
    calismaSaati: Math.floor(os.uptime() / 3600),
    yuk: os.loadavg().map((y) => y.toFixed(2)),
  };
}

const ozet = sistemOzeti();
console.log(Object.keys(ozet));
console.log(ozet.platform, ozet.tur, ozet.mimari, ozet.yuk);
console.log(typeof ozet.paralellik, ozet.toplamBellek.endsWith(' GB'));
const isciSayisi = Math.max(1, os.availableParallelism() - 1);
console.log(isciSayisi >= 1);

// çıktı: [
// çıktı:   'platform',
// çıktı:   'tur',
// çıktı:   'mimari',
// çıktı:   'paralellik',
// çıktı:   'toplamBellek',
// çıktı:   'bosBellekYuzde',
// çıktı:   'calismaSaati',
// çıktı:   'yuk'
// çıktı: ]
// çıktı: win32 Windows_NT x64 [ '0.00', '0.00', '0.00' ]
// çıktı: number true
// çıktı: true

Bu küçük fonksiyon bir sağlık kontrolü (health check) uç noktasında ya da başlangıç günlüğünde sistemin özetini vermek için yeterli. İşçi sayısını availableParallelism() - 1 olarak seçip Math.max(1, ...) ile en az bire sabitlemek, ana iş parçacığına bir çekirdek bırakmanın yaygın bir yoludur; bu bir kural değil, sizin iş yükünüze göre vereceğiniz bir karardır.

Bellek, çalışma süresi ve sistem yükü

os.totalmem() toplam, os.freemem() boş sistem belleğini bayt cinsinden tam sayı olarak döndürür. Bunlar makinenin değerleridir, Node işleminizin kullandığı bellek değil; işleminizin belleğini process.memoryUsage() verir. Bellek sızıntısı ve yığın (heap) analizi gibi konular Node.js performans optimizasyonu yazısında ele alınıyor.

os.uptime() sistemin açık kaldığı süreyi saniye cinsinden döndürür. Belgeler dönüş türünü tam sayı olarak yazıyor ve v10.0.0'dan beri Windows'ta kesirli kısım içermediğini belirtiyor; ama bizim Windows 11 makinemizde v26.13.0 ile denediğimizde 659222.609 gibi ondalıklı bir değer döndü. Saat ya da gün hesaplarken Math.floor() kullanmak bu farktan etkilenmemenizi sağlar.

os.loadavg() 1, 5 ve 15 dakikalık yük ortalamalarını içeren bir dizi döndürür. Belgelere göre yük ortalaması Unix'e özgü bir kavramdır ve Windows'ta dönüş değeri her zaman [0, 0, 0] olur; yukarıdaki çıktılarda tam olarak bunu gördük. Bu yüzden yüke göre karar veren bir kodu (örneğin "yük yüksekse yeni iş alma") Windows'ta test ederseniz hiç tetiklenmediğini görürsünüz.

Kullanıcı, ev klasörü ve geçici klasör

os.homedir() geçerli kullanıcının ev klasörünü verir. Belgelere göre POSIX'te tanımlıysa $HOME ortam değişkenini, Windows'ta tanımlıysa USERPROFILE değişkenini kullanır; değişken yoksa işletim sistemine sorar. os.userInfo() ise doğrudan işletim sisteminden okunan username, uid, gid, shell ve homedir alanlarını döndürür. Windows'ta uid ve gid -1, shell null olur. Kullanıcının adı ya da ev klasörü yoksa SystemError fırlatılır.

javascript
// o2.mjs  (Windows)
import os from 'node:os';
const u = os.userInfo();
console.log(Object.keys(u));
console.log(u.uid, u.gid, u.shell);
console.log(os.homedir() === process.env.USERPROFILE);
const eski = process.env.TEMP;
process.env.TEMP = 'D:\\gecici';
console.log(os.tmpdir());
process.env.TEMP = eski;
console.log(os.constants.signals.SIGINT, os.constants.signals.SIGTERM, os.constants.errno.ENOENT !== undefined);
console.log(os.constants.priority.PRIORITY_LOW, os.constants.priority.PRIORITY_HIGHEST);
console.log(os.getPriority());
console.log(os.platform() === process.platform, os.arch() === process.arch);

// çıktı: [ 'uid', 'gid', 'username', 'homedir', 'shell' ]
// çıktı: -1 -1 null
// çıktı: true
// çıktı: D:\gecici
// çıktı: 2 15 true
// çıktı: 19 -20
// çıktı: 0
// çıktı: true true

os.tmpdir() geçici dosyalar için varsayılan klasörü verir ve belgelere göre ortam değişkenleriyle değiştirilebilir. Windows'ta TEMP ve TMP değişkenlerine bakılır ve TEMP önceliklidir; ikisi de yoksa %SystemRoot%\temp ya da %windir%\temp kullanılır. Windows dışındaki sistemlerde sırasıyla TMPDIR, TMP ve TEMP kontrol edilir, hiçbiri yoksa /tmp döner. Örnekte TEMP değerini çalışma sırasında değiştirince sonucun hemen değiştiğini görüyorsunuz; yani fonksiyon her çağrıda ortam değişkenini yeniden okuyor. v2.0.0'dan beri dönen yolun sonunda hiçbir platformda eğik çizgi yok. Geçici bir klasör oluşturmak için os.tmpdir() değerini fs.mkdtemp() ile birlikte kullanabilirsiniz; bu konu klasör işlemleri yazısında var.

os.constants, öncelik ve ağ arayüzleri

os.constants, öncelik ve ağ arayüzleri: PRIORITY_LOW, PRIORITY_BELOW_NORMAL, PRIORITY_NORMAL, PRIORITY_ABOVE_NORMAL

os.constants işletim sistemine özgü sabitleri gruplar: signals sinyal numaralarını, errno hata kodlarını, priority süreç önceliği sabitlerini ve dlopen ile libuv sabitlerini içerir. Belgeler her sabitin her sistemde bulunmadığını hatırlatıyor. Yukarıdaki örnekte Windows'ta bile SIGINT için 2, SIGTERM için 15 döndü; ama bu sinyallerin Windows'taki davranışı POSIX'ten farklıdır ve child_process yazısında ele alınıyor.

os.getPriority(pid) ve os.setPriority(pid, öncelik) bir sürecin zamanlama önceliğini okur ve değiştirir; pid verilmezse geçerli süreç kullanılır. Öncelik -20 (en yüksek) ile 19 (en düşük) arasında bir tam sayıdır. Windows'ta Unix öncelik düzeyleri ile Windows öncelik sınıfları birebir eşleşmediği için değer altı sabitten birine eşlenir; belgeler karışıklığı önlemek için doğrudan os.constants.priority sabitlerini kullanmayı öneriyor. Windows'ta PRIORITY_HIGHEST ayarlamak yönetici yetkisi ister; yetki yoksa öncelik sessizce PRIORITY_HIGH düzeyine indirilir.

Sabitnice değeri (POSIX)Windows sınıfı
PRIORITY_LOW19IDLE_PRIORITY_CLASS
PRIORITY_BELOW_NORMAL10BELOW_NORMAL_PRIORITY_CLASS
PRIORITY_NORMAL0NORMAL_PRIORITY_CLASS
PRIORITY_ABOVE_NORMAL-7ABOVE_NORMAL_PRIORITY_CLASS
PRIORITY_HIGH-14HIGH_PRIORITY_CLASS
PRIORITY_HIGHEST-20REALTIME_PRIORITY_CLASS

os.networkInterfaces() ağ adresi atanmış arayüzleri döndürür. Her anahtar bir arayüz adıdır ve değeri adres nesnelerinden oluşan bir dizidir. Adres nesnesinde address, netmask, family ('IPv4' veya 'IPv6'), mac, internal ve cidr alanları; IPv6 adreslerinde ayrıca scopeid bulunur. YAML kaydına göre family v18.0.0'da sayıya çevrilmiş, v18.4.0'da yeniden dizeye döndürülmüş; eski kodlarda family === 4 karşılaştırması görürseniz bu yüzden. Aşağıdaki örnek, makinenin adreslerini yazdırmadan IPv4 adreslerini süzüp geri döngü (loopback) adresinin listede olduğunu kontrol ediyor:

javascript
// o3.mjs (ilgili kısım)
import os from 'node:os';
const ipv4 = Object.values(os.networkInterfaces()).flat().filter((a) => a.family === 'IPv4');
console.log(ipv4.some((a) => a.internal && a.address === '127.0.0.1'));
console.log(Object.keys(ipv4[0]));

// çıktı: true
// çıktı: [ 'address', 'netmask', 'family', 'mac', 'internal', 'cidr' ]

Sunucunun dış IP adresini bulmak için bu listeye güvenmek her zaman doğru sonuç vermez: makine bir NAT ya da yük dengeleyici arkasındaysa arayüzde görünen adres özel ağ adresidir. Uygulamanızı tüm arayüzlerde dinletmek istiyorsanız adres bulmak yerine sunucuyu doğrudan uygun adrese bağlamak daha basittir; bu konu http modülü ile sunucu yazısında anlatılıyor.

Fonksiyonların özet tablosu

Fonksiyon / alanDöndürdüğüPlatform notu
os.platform()win32, linux, darwin...process.platform ile aynı
os.type()Windows_NT, Linux, Darwinuname(3) adı
os.arch()x64, arm64...process.arch ile aynı
os.EOLSatır sonuPOSIX: \n, Windows: \r\n
os.cpus()Çekirdek bilgileri dizisiWindows'ta nice her zaman 0
os.availableParallelism()Paralellik tahminiHer zaman sıfırdan büyük
os.totalmem(), os.freemem()BaytMakine belleği, süreç değil
os.loadavg()1, 5, 15 dk yükWindows'ta [0, 0, 0]
os.uptime()SaniyeWindows'ta ondalıklı gözlendi
os.homedir()Ev klasörüÖnce HOME / USERPROFILE
os.tmpdir()Geçici klasörTEMP, TMP, TMPDIR ile değişir
os.userInfo()Kullanıcı bilgisiWindows'ta uid/gid -1, shell null
os.devNullNull aygıt yolu\\.\nul veya /dev/null

Sık yapılan hatalar

  • İşçi sayısını os.cpus().length ile belirlemek: Belgeler bunun yerine os.availableParallelism() öneriyor.
  • os.freemem() değerini işlemin belleği sanmak: Bu, makinenin boş belleğidir; işleminiz için process.memoryUsage() kullanın.
  • Windows'ta os.loadavg() değerine göre karar vermek: Değer her zaman sıfırdır.
  • Gelen metni os.EOL ile bölmek: Başka sistemde yazılmış dosyalarda satırlar bölünmez; /\r?\n/ kullanın.
  • os.type() metniyle platform kontrolü yapmak: Belgelerde sabit listesi olan os.platform() daha güvenilirdir.
  • Ağ arayüzü adlarını sabit yazmak: eth0 gibi adlar sistemden sisteme değişir; family ve internal alanlarıyla süzün.

Sık Sorulan Sorular

os.platform() ile process.platform arasında fark var mı?

Belgelere göre ikisi aynı değeri döndürür. process.platform bir alan, os.platform() bir fonksiyondur; node:os modülünü zaten kullanıyorsanız hangisini seçtiğiniz fark etmez.

Node.js sürecinin kaç çekirdek kullanabildiğini nasıl öğrenirim?

os.availableParallelism() bunun için tasarlandı ve programın varsayılan olarak kullanması gereken paralellik için bir tahmin döndürür. Tek bir Node süreci JavaScript kodunu tek iş parçacığında çalıştırır; daha fazla çekirdekten yararlanmak için worker thread ya da birden fazla süreç kullanmanız gerekir.

Bilgisayarın adını nasıl alırım?

os.hostname() işletim sisteminin host adını dize olarak döndürür. Bu değeri günlüklere yazmak, aynı uygulamanın birden fazla sunucuda çalıştığı durumlarda hangi kaydın hangi makineden geldiğini ayırt etmeyi kolaylaştırır.

Ortam değişkenlerini os modülüyle mi okumalıyım?

Hayır; ortam değişkenleri process.env üzerinden okunur. os modülü yalnızca homedir() ve tmpdir() gibi bazı fonksiyonlarda bu değişkenlere kendisi bakar. Ortam değişkenleri ve --env-file için process.env ve --env-file yazısına bakın.

Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: Node.js öğrenme rehberi · path modülü · Worker threads · process.argv ve çıkış kodları · child_process · cluster ve PM2 · Node.js nedir?