Crear una tarea de ejecución (sys.task)
Declaración
tarea = sys.task(ruta_ejecutable [, argumentos...])
Parámetros
- Ruta del ejecutable
Tipo texto - Argumentos...
Tipo texto, número variable de parámetros opcionales; ninguno de forma predeterminada
Valor devuelto
- Tarea
Objeto de tarea de ejecución; devuelve un objeto para controlar o ejecutar la tarea
Lista de métodos del objeto tarea
| Método | Parámetros | Valor devuelto | Descripción |
|---|---|---|---|
| :launch() | Inicia la tarea y la ejecuta de forma asíncrona | ||
| :wait_until_exit() | Espera sincrónicamente a que termine la tarea y bloquea todos los hilos hasta entonces. | ||
| :set_stdin(flujo_entrada) | Tubería | tipo texto | Establece el flujo de entrada de la tarea. El parámetro puede ser "std", "/dev/null", una ruta de archivo o un objeto tubería. Si se llama después de iniciar la tarea, se produce un error | |
| :stdin() | Tubería | tipo texto | Obtiene el flujo de entrada de la tarea. Puede devolver "std", "/dev/null", una ruta de archivo o un objeto tubería | |
| :set_stdout(flujo_salida) | Tubería | tipo texto | Establece el flujo de salida de la tarea. El parámetro puede ser "std", "/dev/null", una ruta de archivo o un objeto tubería. Si se llama después de iniciar la tarea, se produce un error | |
| :stdout() | Tubería | tipo texto | Obtiene el flujo de salida de la tarea. Puede devolver "std", "/dev/null", una ruta de archivo o un objeto tubería | |
| :set_stderr(flujo_error) | Tubería | tipo texto | Establece el flujo de errores de la tarea. El parámetro puede ser "std", "/dev/null", una ruta de archivo o un objeto tubería. Si se llama después de iniciar la tarea, se produce un error | |
| :stderr() | Tubería | tipo texto | Obtiene el flujo de errores de la tarea. Puede devolver "std", "/dev/null", una ruta de archivo o un objeto tubería | |
| :set_work_dir(directorio) | Tipo texto | Establece el directorio de trabajo de la tarea. Si se llama después de iniciar la tarea, se produce un error | |
| :work_dir() | Tipo texto | Obtiene el directorio de trabajo de la tarea | |
| :set_env(variables_entorno) | Tipo tabla | Establece el diccionario de pares clave-valor de las variables de entorno de la tarea. Si se llama después de iniciar la tarea, se produce un error | |
| :env() | Tipo tabla | Obtiene el diccionario de pares clave-valor de las variables de entorno de la tarea | |
| :pid() | Tipo entero | Obtiene el PID de la tarea; devuelve 0 antes de iniciarla | |
| :is_running() | Tipo booleano | Determina si la tarea se está ejecutando. Aunque :is_running() devuelva false, se debe llamar una vez a :wait_until_exit() para evitar la creación de un proceso zombi | |
| :interrupt() | Tipo booleano | Envía la señal de interrupción SIGINT al proceso principal de la tarea | |
| :terminate() | Tipo booleano | Envía la señal de terminación SIGTERM al proceso principal de la tarea | |
| :kill() | Tipo booleano | Envía la señal de terminación forzada SIGKILL a todos los procesos de la tarea; la operación kill se ejecuta automáticamente al liberar el objeto tarea | |
| :termination_status() | Tipo entero | Obtiene el estado de terminación de la tarea; si aún no ha terminado, devuelve nil, mensaje de error | |
| :termination_reason() | Tipo texto | Obtiene el motivo de terminación de la tarea; si aún no ha terminado, devuelve nil, mensaje de error |
Lista de métodos del objeto tubería
| Método | Parámetros | Valor devuelto | Descripción |
|---|---|---|---|
| :read() | Tipo cadena | Lee los datos que ya están disponibles en la tubería | |
| :write(datos) | Tipo cadena | Escribe datos en la tubería | |
| :wclose() | Tipo booleano, nil | tipo texto | Cierra el extremo de escritura de la tubería; devuelve true si tiene éxito y false, mensaje de error si falla | |
| :rclose() | Tipo booleano, nil | tipo texto | Cierra el extremo de lectura de la tubería; devuelve true si tiene éxito y false, mensaje de error si falla |
Descripción
Crea una tarea de ejecución y devuelve un objeto de tarea de ejecución
Si no se desea bloquear todos los hilos hasta que se complete la tarea, se puede llamar repetidamente a:is_running()del objeto tarea para determinar si sigue ejecutándose; cuando termine, se debe llamar una vez a:wait_until_exit()para confirmar que ha terminado
Esta función solo está disponible a partir de las versiones posteriores a 20250705
Ejemplo
-- Simula el siguiente comando de Shell
-- echo "你好世界" | /usr/bin/gzip -fc | /usr/bin/gzip -dfc
local comp_tsk = sys.task(jbroot('/usr/bin/gzip'), '-fc') -- Crea la tarea de compresión
local decomp_tsk = sys.task(jbroot('/usr/bin/gzip'), '-dfc') -- Crea la tarea de descompresión
decomp_tsk:set_stdin(comp_tsk:stdout()) -- Establece el flujo de entrada de la tarea de descompresión como el flujo de salida de la tarea de compresión
decomp_tsk:launch() -- Inicia la tarea de descompresión
comp_tsk:launch() -- Inicia la tarea de compresión
comp_tsk:stdin():write("你好世界") -- Escribe datos en el flujo de entrada de la tarea de compresión
comp_tsk:stdin():wclose() -- Cierra el extremo de escritura del flujo de entrada de la tarea de compresión para indicar que ha terminado
comp_tsk:wait_until_exit() -- Espera a que termine la tarea de compresión
decomp_tsk:wait_until_exit() -- Espera a que termine la tarea de descompresión
nLog(decomp_tsk:stdout():read()) -- Lee el flujo de salida de la tarea de descompresión, que produce "你好世界"
Ejemplo (llamar al asistente de persistencia de TrollStore para actualizar)
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')
Ejemplo (llamar a TrollStore para instalar o desinstalar una app y reconstruir la caché de iconos)
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
--- Instala una app con TrollStore
---@param ipapath string ruta del paquete de instalación
---@return string? texto del resultado de la instalación; devuelve nil si falla
---@return string? mensaje de error; devuelve nil si tiene éxito
function troll_install(ipapath)
return _trollstorehelper('install', ipapath)
end
--- Desinstala una app instalada por TrollStore
---@param bid string identificador del paquete de la app
---@return string? texto del resultado de la desinstalación; devuelve nil si falla
---@return string? mensaje de error; devuelve nil si tiene éxito
function troll_uninstall(bid)
return _trollstorehelper('uninstall', bid)
end
--- TrollStore reconstruye la caché de iconos; puede tardar un tiempo
---@return string? texto del resultado de la reconstrucción; devuelve nil si falla
---@return string? mensaje de error; devuelve nil si tiene éxito
function troll_rebuild_icon_cache()
return _trollstorehelper('refresh-all')
end
-- Ejemplos de llamada
nLog(troll_install(XXT_SCRIPTS_PATH..'/TrollDecrypt.tipa')) -- Instala TrollDecrypt
nLog(troll_uninstall('com.fiore.trolldecrypt')) -- Desinstala TrollDecrypt
nLog(troll_rebuild_icon_cache()) -- Reconstruye la caché de iconos