Befehlsausführung
Befehlsausführung
Abschnitt betitelt „Befehlsausführung“Führen Sie externe Befehle und Shell-Skripte mit voller Kontrolle über I/O-Streams aus.
Für Executor-Konfiguration siehe Executor.
local exec = require("exec")Einen Executor beschaffen
Abschnitt betitelt „Einen Executor beschaffen“Holen Sie eine Prozess-Executor-Ressource nach ID:
local executor, err = exec.get("app:exec")if err then return nil, errend
-- Executor verwendenlocal proc = executor:exec("ls -la")-- ...
-- Freigeben wenn fertigexecutor:release()| Parameter | Typ | Beschreibung |
|---|---|---|
id | string | Ressourcen-ID |
Gibt zurück: Executor, error
Einen Prozess erstellen
Abschnitt betitelt „Einen Prozess erstellen“Erstellen Sie einen neuen Prozess mit dem angegebenen Befehl:
-- Einfacher Befehllocal proc, err = executor:exec("echo 'Hello, World!'")
-- Mit Arbeitsverzeichnislocal proc = executor:exec("npm install", { work_dir = "/app/project"})
-- Mit Umgebungsvariablenlocal proc = executor:exec("python script.py", { work_dir = "/scripts", env = { PYTHONPATH = "/app/lib", DEBUG = "true", API_KEY = api_key }})
-- Shell-Skript ausführenlocal proc = executor:exec("./deploy.sh production", { work_dir = "/app/scripts", env = { DEPLOY_ENV = "production" }})| Parameter | Typ | Beschreibung |
|---|---|---|
cmd | string | Auszuführender Befehl |
options.work_dir | string | Arbeitsverzeichnis |
options.env | table | Umgebungsvariablen |
Gibt zurück: Process, error
start / wait
Abschnitt betitelt „start / wait“Starten Sie den Prozess und warten Sie auf Abschluss.
local proc = executor:exec("./build.sh")
local ok, err = proc:start()if err then return nil, errend
local exit_code, err = proc:wait()if err then return nil, errend
if exit_code ~= 0 then return nil, errors.new("INTERNAL", "Build failed with exit code: " .. exit_code)endstdout_stream / stderr_stream
Abschnitt betitelt „stdout_stream / stderr_stream“Holen Sie Streams zum Lesen der Prozessausgabe.
local proc = executor:exec("./process-data.sh")
local stdout = proc:stdout_stream()local stderr = proc:stderr_stream()
proc:start()
-- Alle stdout lesenlocal output = {}while true do local chunk = stdout:read(4096) if not chunk then break end table.insert(output, chunk)endlocal result = table.concat(output)
-- Auf Fehler prüfenlocal err_output = {}while true do local chunk = stderr:read(4096) if not chunk then break end table.insert(err_output, chunk)end
local exit_code = proc:wait()
stdout:close()stderr:close()
if exit_code ~= 0 then return nil, errors.new("INTERNAL", table.concat(err_output))end
return resultwrite_stdin
Abschnitt betitelt „write_stdin“Schreiben Sie Daten an Prozess-stdin.
-- Daten an Befehl pipenlocal proc = executor:exec("sort")local stdout = proc:stdout_stream()
proc:start()
-- Eingabe schreibenproc:write_stdin("banana\napple\ncherry\n")proc:write_stdin("") -- EOF signalisieren
-- Sortierte Ausgabe lesenlocal sorted = stdout:read()print(sorted) -- "apple\nbanana\ncherry\n"
proc:wait()stdout:close()signal / close
Abschnitt betitelt „signal / close“Senden Sie Signale oder schließen Sie den Prozess.
local proc = executor:exec("./long-running-server.sh")proc:start()
-- ... später, muss gestoppt werden ...
-- Graceful Shutdown (SIGTERM)proc:close()
-- Oder Force Kill (SIGKILL)proc:close(true)
-- Oder spezifisches Signal sendenlocal SIGINT = 2proc:signal(SIGINT)Berechtigungen
Abschnitt betitelt „Berechtigungen“Exec-Operationen unterliegen der Sicherheitsrichtlinienauswertung.
| Aktion | Ressource | Beschreibung |
|---|---|---|
exec.get | Executor-ID | Executor-Ressource beschaffen |
exec.run | Befehl | Einen bestimmten Befehl ausführen |
| Bedingung | Art | Wiederholbar |
|---|---|---|
| Ungültige ID | errors.INVALID | nein |
| Berechtigung verweigert | errors.INVALID | nein |
| Prozess geschlossen | errors.INVALID | nein |
| Prozess nicht gestartet | errors.INVALID | nein |
| Bereits gestartet | errors.INVALID | nein |
Siehe Fehlerbehandlung für die Arbeit mit Fehlern.