Créer une tâche d’exécution (sys.task)
Déclaration
tâche = sys.task(chemin_exécutable [, arguments...])
Paramètres
- chemin_exécutable — Texte
- arguments... — Arguments variables facultatifs de type texte, aucun par défaut
Valeur de retour
- tâche — Objet de tâche d’exécution pour contrôler ou exécuter la tâche
Méthodes de l’objet tâche
| Méthode | Paramètres | Valeur de retour | Description |
|---|---|---|---|
| :launch() | Lance la tâche de manière asynchrone | ||
| :wait_until_exit() | Attend la fin de manière synchrone et bloque tous les threads | ||
| :set_stdin(fluxEntrée) | Pipe | Texte | Définit le flux d’entrée ; "std", "/dev/null", un chemin ou un objet pipe sont acceptés. Une erreur est levée après le lancement | |
| :stdin() | Pipe | Texte | Obtient le flux d’entrée, qui peut être "std", "/dev/null", un chemin ou un objet pipe | |
| :set_stdout(fluxSortie) | Pipe | Texte | Définit le flux de sortie ; "std", "/dev/null", un chemin ou un objet pipe sont acceptés. Une erreur est levée après le lancement | |
| :stdout() | Pipe | Texte | Obtient le flux de sortie, qui peut être "std", "/dev/null", un chemin ou un objet pipe | |
| :set_stderr(fluxErreur) | Pipe | Texte | Définit le flux d’erreur ; "std", "/dev/null", un chemin ou un objet pipe sont acceptés. Une erreur est levée après le lancement | |
| :stderr() | Pipe | Texte | Obtient le flux d’erreur, qui peut être "std", "/dev/null", un chemin ou un objet pipe | |
| :set_work_dir(répertoire) | Texte | Définit le répertoire de travail ; une erreur est levée après le lancement | |
| :work_dir() | Texte | Obtient le répertoire de travail | |
| :set_env(variablesEnvironnement) | Table | Définit le dictionnaire des variables d’environnement ; une erreur est levée après le lancement | |
| :env() | Table | Obtient le dictionnaire des variables d’environnement | |
| :pid() | Entier | Obtient le PID ; renvoie 0 avant le lancement | |
| :is_running() | Booléen | Vérifie si la tâche est en cours. Même si :is_running() renvoie false, appelez une fois :wait_until_exit() pour éviter un processus zombie | |
| :interrupt() | Booléen | Envoie SIGINT au processus principal | |
| :terminate() | Booléen | Envoie SIGTERM au processus principal | |
| :kill() | Booléen | Envoie SIGKILL à tous les processus ; s’exécute automatiquement lors de la récupération de l’objet | |
| :termination_status() | Entier | Obtient l’état de terminaison ; renvoie nil, message d’erreur si la tâche n’est pas terminée | |
| :termination_reason() | Texte | Obtient la cause de terminaison ; renvoie nil, message d’erreur si la tâche n’est pas terminée |
Méthodes de l’objet pipe
| Méthode | Paramètres | Valeur de retour | Description |
|---|---|---|---|
| :read() | Chaîne | Lit les données déjà disponibles | |
| :write(données) | Chaîne | Écrit des données dans le pipe | |
| :wclose() | Booléen, nil | Texte | Ferme l’écriture ; renvoie true en cas de succès, false, message d’erreur en cas d’échec | |
| :rclose() | Booléen, nil | Texte | Ferme la lecture ; renvoie true en cas de succès, false, message d’erreur en cas d’échec |
Description
Crée une tâche d’exécution et renvoie son objet. Pour ne pas bloquer tous les threads, appelez périodiquement
:is_running(); après l’arrêt, appelez une fois:wait_until_exit()pour confirmer la fin. Disponible uniquement dans les versions postérieures au 20250705.
Exemple
-- Simuler la commande Shell suivante
-- echo "你好世界" | /usr/bin/gzip -fc | /usr/bin/gzip -dfc
local comp_tsk = sys.task(jbroot('/usr/bin/gzip'), '-fc') -- Créer la tâche de compression
local decomp_tsk = sys.task(jbroot('/usr/bin/gzip'), '-dfc') -- Créer la tâche de décompression
decomp_tsk:set_stdin(comp_tsk:stdout()) -- Relier la sortie de compression à l’entrée de décompression
decomp_tsk:launch() -- Lancer la décompression
comp_tsk:launch() -- Lancer la compression
comp_tsk:stdin():write("你好世界") -- Écrire dans l’entrée de compression
comp_tsk:stdin():wclose() -- Fermer l’entrée de compression
comp_tsk:wait_until_exit() -- Attendre la fin de la compression
decomp_tsk:wait_until_exit() -- Attendre la fin de la décompression
nLog(decomp_tsk:stdout():read()) -- Lire la sortie, affiche "你好世界"
Exemple (actualiser l’assistant de persistance TrollStore)
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')
Exemple (installer/désinstaller une app avec TrollStore et reconstruire le cache d’icônes)
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
--- Installer une app avec TrollStore
---@param ipapath string Chemin du paquet
---@return string? Résultat, nil en cas d’échec
---@return string? Erreur, nil en cas de succès
function troll_install(ipapath)
return _trollstorehelper('install', ipapath)
end
--- Désinstaller une app installée avec TrollStore
---@param bid string Identifiant de bundle
---@return string? Résultat, nil en cas d’échec
---@return string? Erreur, nil en cas de succès
function troll_uninstall(bid)
return _trollstorehelper('uninstall', bid)
end
--- Reconstruire le cache d’icônes avec TrollStore
---@return string? Résultat, nil en cas d’échec
---@return string? Erreur, nil en cas de succès
function troll_rebuild_icon_cache()
return _trollstorehelper('refresh-all')
end
-- Appels d’exemple
nLog(troll_install(XXT_SCRIPTS_PATH..'/TrollDecrypt.tipa')) -- Installer TrollDecrypt
nLog(troll_uninstall('com.fiore.trolldecrypt')) -- Désinstaller TrollDecrypt
nLog(troll_rebuild_icon_cache()) -- Reconstruire le cache d’icônes