System

Abfragen von Laufzeit-Systeminformationen einschließlich Speicherverbrauch, Garbage-Collection-Statistiken, CPU-Details und Prozess-Metadaten.

Laden

local system = require("system")

Shutdown

Systemshutdown mit Exit-Code auslösen. Nützlich für Terminal-Apps; Aufruf aus laufenden Actors beendet das gesamte System:

local ok, err = system.exit(0)
Parameter Typ Beschreibung
code integer Exit-Code (0 = Erfolg), Standard ist 0

Gibt zurück: boolean, error

Module auflisten

Alle geladenen Lua-Module mit Metadaten abrufen:

local mods, err = system.modules()

Gibt zurück: table[], error

Jede Modul-Tabelle enthält:

Feld Typ Beschreibung
name string Modulname
description string Modulbeschreibung
class string[] Modul-Klassifizierungs-Tags

Speicherstatistiken

Detaillierte Speicherstatistiken abrufen:

local stats, err = system.memory.stats()

Gibt zurück: table, error

Stats-Tabelle enthält:

Feld Typ Beschreibung
alloc number Zugewiesene und verwendete Bytes
total_alloc number Kumulativ zugewiesene Bytes
sys number Vom System erhaltene Bytes
heap_alloc number Auf Heap zugewiesene Bytes
heap_sys number Für Heap vom System erhaltene Bytes
heap_idle number Bytes in ungenutzten Spans
heap_in_use number Bytes in genutzten Spans
heap_released number An OS freigegebene Bytes
heap_objects number Anzahl zugewiesener Heap-Objekte
stack_in_use number Vom Stack-Allocator verwendete Bytes
stack_sys number Für Stack vom System erhaltene Bytes
mspan_in_use number Bytes von mspan-Strukturen in Verwendung
mspan_sys number Für mspan vom System erhaltene Bytes
num_gc number Anzahl abgeschlossener GC-Zyklen
next_gc number Ziel-Heap-Größe für nächsten GC

Aktuelle Zuweisung

Aktuell zugewiesene Bytes abrufen:

local bytes, err = system.memory.allocated()

Gibt zurück: number, error

Heap-Objekte

Anzahl zugewiesener Heap-Objekte abrufen:

local count, err = system.memory.heap_objects()

Gibt zurück: number, error

Speicherlimit

Speicherlimit setzen (gibt vorherigen Wert zurück):

local prev, err = system.memory.set_limit(1024 * 1024 * 100)
Parameter Typ Beschreibung
limit integer Speicherlimit in Bytes, -1 für unbegrenzt

Gibt zurück: number, error

Aktuelles Speicherlimit abrufen:

local limit, err = system.memory.get_limit()

Gibt zurück: number, error

GC erzwingen

Garbage Collection erzwingen:

local ok, err = system.gc.collect()

Gibt zurück: boolean, error

GC-Zielprozentsatz

GC-Zielprozentsatz setzen (gibt vorherigen Wert zurück). Ein Wert von 100 bedeutet, dass GC ausgelöst wird, wenn sich der Heap verdoppelt:

local prev, err = system.gc.set_percent(200)
Parameter Typ Beschreibung
percent integer GC-Zielprozentsatz

Gibt zurück: number, error

Aktuellen GC-Zielprozentsatz abrufen:

local percent, err = system.gc.get_percent()

Gibt zurück: number, error

Goroutine-Anzahl

Anzahl aktiver Goroutines abrufen:

local count, err = system.runtime.goroutines()

Gibt zurück: number, error

GOMAXPROCS

GOMAXPROCS-Wert abrufen oder setzen:

-- Aktuellen Wert abrufen
local current, err = system.runtime.max_procs()

-- Neuen Wert setzen
local prev, err = system.runtime.max_procs(4)
Parameter Typ Beschreibung
n integer Falls angegeben, setzt GOMAXPROCS (muss > 0 sein)

Gibt zurück: number, error

CPU-Anzahl

Anzahl logischer CPUs abrufen:

local cpus, err = system.runtime.cpu_count()

Gibt zurück: number, error

Prozess-ID

Aktuelle Prozess-ID abrufen:

local pid, err = system.process.pid()

Gibt zurück: number, error

Hostname

System-Hostname abrufen:

local hostname, err = system.process.hostname()

Gibt zurück: string, error

Arbeitsverzeichnis

Aktuelles Arbeitsverzeichnis der Laufzeit abrufen:

local dir, err = system.process.cwd()

Gibt zurück: string, error

Prozess-Hosts

Alle Prozess-Hosts mit Worker- und Queue-Statistiken auflisten:

local hosts, err = system.hosts.list()

Gibt zurück: table[], error

Jede Host-Tabelle enthält:

Feld Typ Beschreibung
id string Host-Registry-ID
workers number Größe des Worker-Pools
processes number Aktive Prozesse auf diesem Host
executed number Insgesamt ausgeführte Schritte
stolen number Von anderen Hosts gestohlene Schritte
queue_depth number Ausstehende Einträge in der Host-Queue

Auf einem bestimmten Host laufende Prozesse auflisten:

local procs, err = system.hosts.processes("app:host")
Parameter Typ Beschreibung
host_id string Host-Registry-ID

Gibt zurück: table[], error

Jede Prozess-Tabelle enthält:

Feld Typ Beschreibung
pid string Prozess-ID
host string Host-ID
source string Quell-Eintrag-ID
state string Prozessstatus
steps number Ausgeführte Schritte
started_at number Start-Zeitstempel (Nanosekunden)
parent string Parent-PID (entfällt, falls keine)
actor_id string Actor-ID (entfällt, falls keine)
stats table Prozessspezifische Stats (optional)

Service-Status

Status für einen spezifischen überwachten Service abrufen:

local state, err = system.supervisor.state("namespace:service")
Parameter Typ Beschreibung
service_id string Service-ID (z.B. "namespace:service")

Gibt zurück: table, error

Status-Tabelle enthält:

Feld Typ Beschreibung
id string Service-ID
status string Aktueller Status
desired string Gewünschter Status
retry_count number Anzahl der Wiederholungen
last_update number Letzter Aktualisierungszeitstempel (Nanosekunden)
started_at number Start-Zeitstempel (Nanosekunden)
details string Optionale Details (formatiert)

Alle Service-Status

Status für alle überwachten Services abrufen:

local states, err = system.supervisor.states()

Gibt zurück: table[], error

Jede Status-Tabelle hat das gleiche Format wie system.supervisor.state().

Cluster-Primitive

Die Subtabellen system.node, system.cluster, system.raft und system.lock legen die Clustering-Schicht frei. Sie sind am nützlichsten, wenn Clustering aktiviert ist; auf einem Einzelknoten degradieren sie vorhersagbar — system.raft.* meldet "raft not available", system.cluster meldet nur den lokalen Knoten, und system.lock erfordert die globale Registry, die Clustering bereitstellt.

Alle Leseaufrufe sind lokal und günstig: sie melden die Sicht dieses Knotens auf den committierten Zustand, ohne je das Netzwerk zu blockieren.

Knotenidentität

system.node meldet die eigene Identität dieses Knotens im Cluster.

local id, err = system.node.id()      -- ID dieses Knotens
local addr, err = system.node.addr()  -- beworbene Netzwerkadresse
local role, err = system.node.role()  -- "leader" | "voter" | "standby" | "non-member"
Funktion Gibt zurück Hinweise
system.node.id() string, error Knoten-ID aus dem Relay-Kontext
system.node.addr() string, error Beworbene Adresse (z.B. 10.0.0.1:7946); Fehler wenn Mitgliedschaft nicht verfügbar
system.node.role() string, error Raft-Rolle dieses Knotens; gibt "non-member" (kein Fehler) zurück wenn Raft nicht läuft

Berechtigung: system.read auf node.

Cluster-Mitgliedschaft

system.cluster meldet die clusterweite Sicht: wer die Mitglieder sind und wer führt.

local members, err = system.cluster.members()  -- Array von Knoten-Tabellen
local leader, err = system.cluster.leader()    -- Leader-Knoten-ID oder "" wenn unbekannt
local n, err = system.cluster.size()           -- Anzahl sichtbarer Mitglieder

system.cluster.members() gibt ein Array von Knoten-Tabellen zurück. Der lokale Knoten ist einmal enthalten und sortiert zuerst.

Feld Typ Beschreibung
id string Knoten-ID
is_local boolean True für den aufrufenden Knoten
addr string Beworbene Adresse (entfällt wenn unbekannt)
meta table String-zu-String-Gossip-Metadaten (entfällt wenn keine)
Funktion Gibt zurück Hinweise
system.cluster.members() table[], error Fehler wenn keine Mitgliedschaftsinformationen erreichbar
system.cluster.leader() string, error Aktuelle Raft-Leader-ID; "" (kein Fehler) wenn Leader unbekannt oder Raft fehlt
system.cluster.size() number, error Anzahl sichtbarer Mitglieder; 0 wenn keine Mitgliedschaftsinfo verfügbar

Berechtigung: system.read auf cluster.

Raft-Zustand

system.raft liest die lokale Sicht dieses Knotens auf den Raft-Konsenskern. Jede Funktion gibt nil, error ("raft not available") zurück, wenn Raft auf diesem Knoten nicht läuft.

local leader, err = system.raft.is_leader()      -- boolean
local member, err = system.raft.is_member()      -- boolean: Voter oder Standby
local role, err = system.raft.role()             -- gleiche Werte wie system.node.role()
local term, err = system.raft.term()             -- aktueller Raft-Term
local idx, err = system.raft.commit_index()      -- höchster committierter Log-Index
local stats, err = system.raft.stats()           -- rohe Stats-Map (string -> string)
Funktion Gibt zurück Hinweise
system.raft.is_leader() boolean, error True genau dann, wenn dieser Knoten der aktuelle Leader ist
system.raft.is_member() boolean, error True genau dann, wenn dieser Knoten Voter oder Standby in der committieren Konfiguration ist
system.raft.role() string, error "leader" / "voter" / "standby" / "non-member"
system.raft.term() number, error Aktueller Term; 0 wenn aus Stats nicht verfügbar
system.raft.commit_index() number, error Höchster committierter Log-Index auf diesem Knoten
system.raft.stats() table, error Vollständige rohe Stats-Map; Schlüssel und Werte sind Strings

Berechtigung: system.read auf raft, außer system.raft.stats(), das system.read auf raft_stats erfordert.

Verteilte Sperren

system.lock bietet clusterweiten gegenseitigen Ausschluss. Eine Sperre ist ein global eindeutiger Name, der dem aufrufenden Prozess gehört. Sie baut auf dem Strong-Namens-Scope auf, sodass höchstens ein Halter clusterweit existieren kann, und die Sperre wird automatisch freigegeben, wenn der Halterprozess endet oder sein Knoten ausscheidet — es gibt keine steckengebliebene Sperre zu bereinigen.

local ok, err = system.lock.acquire("orders.migration")
if ok then
  -- kritischer Abschnitt: nur ein Halter clusterweit
  system.lock.release("orders.migration")
end

Erwerben ist fail-fast: wenn die Sperre bereits gehalten wird, gibt es sofort false zurück statt zu blockieren, sodass Aufrufer eigenes Retry und Backoff implementieren. Nur der aktuelle Halter kann freigeben; eine Sperre freizugeben, die man nicht hält, ist ein sicheres No-Op.

Funktion Gibt zurück Ergebnisse
system.lock.acquire(name) boolean, error true, nil erworben; false, error bereits gehalten (Art errors.ALREADY_EXISTS); nil, error bei Fehler
system.lock.release(name) boolean, error true, nil freigegeben; false, nil nicht gehalten oder von anderem Prozess gehalten; nil, error bei Fehler
Parameter Typ Beschreibung
name string Clusterweiter Sperrenname

Berechtigung: system.lock auf dem Sperren-name (sodass eine Richtlinie einschränken kann, welche Namen ein Aufrufer sperren darf).

Berechtigungen

Systemoperationen unterliegen der Sicherheitsrichtlinienauswertung.

Aktion Ressource Beschreibung
system.read memory Speicherstatistiken lesen
system.read memory_limit Speicherlimit lesen
system.control memory_limit Speicherlimit setzen
system.read gc_percent GC-Prozentsatz lesen
system.gc gc Garbage Collection erzwingen
system.gc gc_percent GC-Prozentsatz setzen
system.read goroutines Goroutine-Anzahl lesen
system.read gomaxprocs GOMAXPROCS lesen
system.control gomaxprocs GOMAXPROCS setzen
system.read cpu CPU-Anzahl lesen
system.read pid Prozess-ID lesen
system.read hostname Hostname lesen
system.read cwd Arbeitsverzeichnis lesen
system.read hosts Hosts / Host-Prozesse auflisten
system.read modules Geladene Module auflisten
system.read supervisor Supervisor-Status lesen
system.read node Identität dieses Knotens lesen
system.read cluster Cluster-Mitgliedschaft und Leader lesen
system.read raft Raft-Zustand lesen
system.read raft_stats Rohe Raft-Stats-Map lesen
system.lock <Sperrenname> Eine verteilte Sperre erwerben oder freigeben
system.exit - System-Shutdown auslösen

Fehler

Bedingung Art Wiederholbar
Berechtigung verweigert errors.INVALID nein
Ungültiges Argument errors.INVALID nein
Fehlendes erforderliches Argument errors.INVALID nein
Code-Manager nicht verfügbar errors.INTERNAL nein
Service-Info nicht verfügbar errors.INTERNAL nein
OS-Fehler (hostname, cwd) errors.INTERNAL nein
Raft läuft nicht auf diesem Knoten errors.INTERNAL nein
Mitgliedschaft nicht verfügbar errors.INTERNAL nein
Sperre bereits gehalten errors.ALREADY_EXISTS nein

Siehe Fehlerbehandlung für die Arbeit mit Fehlern.