Zum Hauptinhalt springen

Eine Ausführungsaufgabe erstellen (sys.task)

Deklaration

Aufgabe = sys.task(Ausführbarer_Pfad [, Parameter...])

Parameter

  • Ausführbarer_Pfad
    Text
  • Parameter...
    Text, optionale variable Anzahl von Parametern; standardmäßig keine

Rückgabewert

  • Aufgabe
    Aufgabenobjekt; gibt ein Objekt zur Steuerung oder Ausführung der Aufgabe zurück

Methodenliste des Aufgabenobjekts

MethodeParameterRückgabewertBeschreibung
:launch()Aufgabe starten und asynchron ausführen
:wait_until_exit()Synchron auf das Ende der Aufgabe warten; bis zum Ende werden alle Threads blockiert.
:set_stdin(Eingabestream)Pipe | TextDen Eingabestream der Aufgabe setzen. Der Parameter kann "std", "/dev/null", ein Dateipfad oder ein Pipe-Objekt sein. Ein Aufruf nach dem Start der Aufgabe löst einen Fehler aus
:stdin()Pipe | TextDen Eingabestream der Aufgabe abrufen. Kann "std", "/dev/null", ein Dateipfad oder ein Pipe-Objekt zurückgeben
:set_stdout(Ausgabestream)Pipe | TextDen Ausgabestream der Aufgabe setzen. Der Parameter kann "std", "/dev/null", ein Dateipfad oder ein Pipe-Objekt sein. Ein Aufruf nach dem Start der Aufgabe löst einen Fehler aus
:stdout()Pipe | TextDen Ausgabestream der Aufgabe abrufen. Kann "std", "/dev/null", ein Dateipfad oder ein Pipe-Objekt zurückgeben
:set_stderr(Fehlerstream)Pipe | TextDen Fehlerstream der Aufgabe setzen. Der Parameter kann "std", "/dev/null", ein Dateipfad oder ein Pipe-Objekt sein. Ein Aufruf nach dem Start der Aufgabe löst einen Fehler aus
:stderr()Pipe | TextDen Fehlerstream der Aufgabe abrufen. Kann "std", "/dev/null", ein Dateipfad oder ein Pipe-Objekt zurückgeben
:set_work_dir(Verzeichnis)TextDas Arbeitsverzeichnis der Aufgabe setzen. Ein Aufruf nach dem Start der Aufgabe löst einen Fehler aus
:work_dir()TextDas Arbeitsverzeichnis der Aufgabe abrufen
:set_env(Umgebungsvariablen)TabelleDas Schlüssel-Wert-Verzeichnis der Umgebungsvariablen der Aufgabe setzen. Ein Aufruf nach dem Start der Aufgabe löst einen Fehler aus
:env()TabelleDas Schlüssel-Wert-Verzeichnis der Umgebungsvariablen der Aufgabe abrufen
:pid()GanzzahlDie Prozess-ID der Aufgabe abrufen; vor dem Start der Aufgabe wird 0 zurückgegeben
:is_running()Boolescher WertPrüfen, ob die Aufgabe ausgeführt wird. Auch wenn :is_running() false zurückgibt, sollte einmal :wait_until_exit() für die Aufgabe aufgerufen werden, um die Erzeugung eines Zombieprozesses zu verhindern
:interrupt()Boolescher WertDas Hauptprozess der Aufgabe ein SIGINT-Signal zum Beenden senden
:terminate()Boolescher WertDas Hauptprozess der Aufgabe ein SIGTERM-Signal zum Beenden senden
:kill()Boolescher WertEin SIGKILL-Signal zum gewaltsamen Beenden an alle Prozesse der Aufgabe senden; bei der Freigabe des Aufgabenobjekts wird die kill-Operation automatisch ausgeführt
:termination_status()GanzzahlDen Beendigungsstatus der Aufgabe abrufen; wenn die Aufgabe noch nicht beendet ist, wird nil und eine Fehlermeldung zurückgegeben
:termination_reason()TextDen Beendigungsgrund der Aufgabe abrufen; wenn die Aufgabe noch nicht beendet ist, wird nil und eine Fehlermeldung zurückgegeben

Methodenliste des Pipe-Objekts

MethodeParameterRückgabewertBeschreibung
:read()StringBereits verfügbare Daten aus der Pipe lesen
:write(Daten)StringDaten in die Pipe schreiben
:wclose()Boolescher Wert, nil | TextDie Schreibseite der Pipe schließen; bei Erfolg wird true, bei Fehler false, Fehlermeldung zurückgegeben
:rclose()Boolescher Wert, nil | TextDie Leseseite der Pipe schließen; bei Erfolg wird true, bei Fehler false, Fehlermeldung zurückgegeben

Hinweise

Erstellt eine Ausführungsaufgabe und gibt ein Aufgabenobjekt zurück.
Wenn nicht alle Threads blockiert werden sollen, während auf den Abschluss der Aufgabe gewartet wird, kann wiederholt :is_running() des Aufgabenobjekts aufgerufen werden, um zu prüfen, ob sie noch läuft. Nach ihrem Ende einmal :wait_until_exit() aufrufen, um zu bestätigen, dass sie beendet wurde.
Diese Funktion ist erst in Versionen nach 20250705 verfügbar.

Beispiel

-- Simuliert den folgenden Shell-Befehl
-- echo "你好世界" | /usr/bin/gzip -fc | /usr/bin/gzip -dfc

local comp_tsk = sys.task(jbroot('/usr/bin/gzip'), '-fc') -- Komprimierungsaufgabe erstellen
local decomp_tsk = sys.task(jbroot('/usr/bin/gzip'), '-dfc') -- Dekomprimierungsaufgabe erstellen

decomp_tsk:set_stdin(comp_tsk:stdout()) -- Eingabestream der Dekomprimierungsaufgabe auf den Ausgabestream der Komprimierungsaufgabe setzen

decomp_tsk:launch() -- Dekomprimierungsaufgabe starten
comp_tsk:launch() -- Komprimierungsaufgabe starten

comp_tsk:stdin():write("你好世界") -- Daten in den Eingabestream der Komprimierungsaufgabe schreiben
comp_tsk:stdin():wclose() -- Schreibseite des Eingabestreams der Komprimierungsaufgabe schließen; der Eingabestream ist damit beendet

comp_tsk:wait_until_exit() -- Auf das Ende der Komprimierungsaufgabe warten
decomp_tsk:wait_until_exit() -- Auf das Ende der Dekomprimierungsaufgabe warten

nLog(decomp_tsk:stdout():read()) -- Ausgabestream der Dekomprimierungsaufgabe lesen; Ausgabe "你好世界"

Beispiel (den TrollStore Persistence Helper zum Aktualisieren aufrufen)

local persistence_helper_path = app.bundle_path('com.apple.tips')
if not persistence_helper_path then
nLog('没有检测到 Tips.app,请先从 AppStore 安装 Tips(提示)应用')
return
end
local root_helper_path = persistence_helper_path..'/trollstorehelper'
if file.exists(root_helper_path) ~= 'file' then
nLog('未注入巨魔持久助手到 Tips,请先从 TrollStore -> Settings -> Install Persistence Helper 选择 Tips 注入')
return
end
local tsk = sys.task(root_helper_path, 'refresh')
tsk:launch()
tsk:wait_until_exit()
sys.killall(9, 'SpringBoard', 'backboardd')

Beispiel (TrollStore zum Installieren/Deinstallieren von Apps und zum Neuerstellen des Icon-Caches aufrufen)

local function _trollstorehelper(...)
local troll_path = app.bundle_path('com.opa334.TrollStore')
assert(type(troll_path) == 'string', 'TrollStore needs to be installed.')
local tsk = sys.task(troll_path..'/trollstorehelper', ...)
tsk:set_stdin('/dev/null')
tsk:launch()
local outbuf = {}
local errbuf = {}
local function drain_stream(stream, buf)
local data = stream:read('nb')
if data and #data > 0 then
buf[#buf + 1] = data
end
end
while tsk:is_running() do
drain_stream(tsk:stdout(), outbuf)
drain_stream(tsk:stderr(), errbuf)
sys.msleep(100)
end
tsk:wait_until_exit()
drain_stream(tsk:stdout(), outbuf)
drain_stream(tsk:stderr(), errbuf)
if tsk:termination_status() == 0 then
local ret = table.concat(outbuf)
return ret
else
local ret = table.concat(errbuf)
return nil, ret
end
end

--- Eine App mit TrollStore installieren
---@param ipapath string Pfad des Installationspakets
---@return string? Text des Installationsergebnisses; bei Fehler nil
---@return string? Fehlermeldung; bei Erfolg nil
function troll_install(ipapath)
return _trollstorehelper('install', ipapath)
end

--- Eine mit TrollStore installierte App deinstallieren
---@param bid string Paketbezeichner der App
---@return string? Text des Deinstallationsergebnisses; bei Fehler nil
---@return string? Fehlermeldung; bei Erfolg nil
function troll_uninstall(bid)
return _trollstorehelper('uninstall', bid)
end

--- Den Icon-Cache mit TrollStore neu erstellen; dies kann einige Zeit dauern
---@return string? Text des Ergebnisses der Neuerstellung; bei Fehler nil
---@return string? Fehlermeldung; bei Erfolg nil
function troll_rebuild_icon_cache()
return _trollstorehelper('refresh-all')
end

-- Beispielaufrufe
nLog(troll_install(XXT_SCRIPTS_PATH..'/TrollDecrypt.tipa')) -- TrollDecrypt installieren
nLog(troll_uninstall('com.fiore.trolldecrypt')) -- TrollDecrypt deinstallieren
nLog(troll_rebuild_icon_cache()) -- Icon-Cache neu erstellen