Aller au contenu principal

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éthodeParamètresValeur de retourDescription
: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 | TexteDé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 | TexteObtient le flux d’entrée, qui peut être "std", "/dev/null", un chemin ou un objet pipe
:set_stdout(fluxSortie)Pipe | TexteDé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 | TexteObtient le flux de sortie, qui peut être "std", "/dev/null", un chemin ou un objet pipe
:set_stderr(fluxErreur)Pipe | TexteDé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 | TexteObtient le flux d’erreur, qui peut être "std", "/dev/null", un chemin ou un objet pipe
:set_work_dir(répertoire)TexteDéfinit le répertoire de travail ; une erreur est levée après le lancement
:work_dir()TexteObtient le répertoire de travail
:set_env(variablesEnvironnement)TableDéfinit le dictionnaire des variables d’environnement ; une erreur est levée après le lancement
:env()TableObtient le dictionnaire des variables d’environnement
:pid()EntierObtient le PID ; renvoie 0 avant le lancement
:is_running()BooléenVé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éenEnvoie SIGINT au processus principal
:terminate()BooléenEnvoie SIGTERM au processus principal
:kill()BooléenEnvoie SIGKILL à tous les processus ; s’exécute automatiquement lors de la récupération de l’objet
:termination_status()EntierObtient l’état de terminaison ; renvoie nil, message d’erreur si la tâche n’est pas terminée
:termination_reason()TexteObtient 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éthodeParamètresValeur de retourDescription
:read()ChaîneLit les données déjà disponibles
:write(données)ChaîneÉcrit des données dans le pipe
:wclose()Booléen, nil | TexteFerme l’écriture ; renvoie true en cas de succès, false, message d’erreur en cas d’échec
:rclose()Booléen, nil | TexteFerme 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