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
| Methode | Parameter | Rückgabewert | Beschreibung |
|---|---|---|---|
| :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 | Text | Den 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 | Text | Den Eingabestream der Aufgabe abrufen. Kann "std", "/dev/null", ein Dateipfad oder ein Pipe-Objekt zurückgeben | |
| :set_stdout(Ausgabestream) | Pipe | Text | Den 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 | Text | Den Ausgabestream der Aufgabe abrufen. Kann "std", "/dev/null", ein Dateipfad oder ein Pipe-Objekt zurückgeben | |
| :set_stderr(Fehlerstream) | Pipe | Text | Den 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 | Text | Den Fehlerstream der Aufgabe abrufen. Kann "std", "/dev/null", ein Dateipfad oder ein Pipe-Objekt zurückgeben | |
| :set_work_dir(Verzeichnis) | Text | Das Arbeitsverzeichnis der Aufgabe setzen. Ein Aufruf nach dem Start der Aufgabe löst einen Fehler aus | |
| :work_dir() | Text | Das Arbeitsverzeichnis der Aufgabe abrufen | |
| :set_env(Umgebungsvariablen) | Tabelle | Das Schlüssel-Wert-Verzeichnis der Umgebungsvariablen der Aufgabe setzen. Ein Aufruf nach dem Start der Aufgabe löst einen Fehler aus | |
| :env() | Tabelle | Das Schlüssel-Wert-Verzeichnis der Umgebungsvariablen der Aufgabe abrufen | |
| :pid() | Ganzzahl | Die Prozess-ID der Aufgabe abrufen; vor dem Start der Aufgabe wird 0 zurückgegeben | |
| :is_running() | Boolescher Wert | Prü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 Wert | Das Hauptprozess der Aufgabe ein SIGINT-Signal zum Beenden senden | |
| :terminate() | Boolescher Wert | Das Hauptprozess der Aufgabe ein SIGTERM-Signal zum Beenden senden | |
| :kill() | Boolescher Wert | Ein 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() | Ganzzahl | Den Beendigungsstatus der Aufgabe abrufen; wenn die Aufgabe noch nicht beendet ist, wird nil und eine Fehlermeldung zurückgegeben | |
| :termination_reason() | Text | Den Beendigungsgrund der Aufgabe abrufen; wenn die Aufgabe noch nicht beendet ist, wird nil und eine Fehlermeldung zurückgegeben |
Methodenliste des Pipe-Objekts
| Methode | Parameter | Rückgabewert | Beschreibung |
|---|---|---|---|
| :read() | String | Bereits verfügbare Daten aus der Pipe lesen | |
| :write(Daten) | String | Daten in die Pipe schreiben | |
| :wclose() | Boolescher Wert, nil | Text | Die Schreibseite der Pipe schließen; bei Erfolg wird true, bei Fehler false, Fehlermeldung zurückgegeben | |
| :rclose() | Boolescher Wert, nil | Text | Die 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