Chuyển tới nội dung chính

Tạo tác vụ thực thi (sys.task)

Khai báo

task = sys.task(executable_path [, arguments...])

Tham số

  • executable_path
    Kiểu chuỗi
  • arguments...
    Kiểu chuỗi, các đối số biến thiên không bắt buộc, mặc định không có

Giá trị trả về

  • task
    Đối tượng tác vụ thực thi, dùng để điều khiển hoặc chạy tác vụ

Phương thức của đối tượng tác vụ

Phương thứcTham sốGiá trị trả vềMô tả
:launch()Khởi chạy tác vụ theo cách bất đồng bộ
:wait_until_exit()Chờ đồng bộ cho đến khi tác vụ hoàn tất; chặn tất cả luồng cho đến khi tác vụ kết thúc
:set_stdin(input_stream)Pipe | ChuỗiĐặt luồng đầu vào của tác vụ. Tham số có thể là "std", "/dev/null", đường dẫn tệp hoặc đối tượng pipe. Phát sinh lỗi nếu gọi sau khi đã khởi chạy tác vụ
:stdin()Pipe | ChuỗiLấy luồng đầu vào của tác vụ. Có thể trả về "std", "/dev/null", đường dẫn tệp hoặc đối tượng pipe
:set_stdout(output_stream)Pipe | ChuỗiĐặt luồng đầu ra của tác vụ. Tham số có thể là "std", "/dev/null", đường dẫn tệp hoặc đối tượng pipe. Phát sinh lỗi nếu gọi sau khi đã khởi chạy tác vụ
:stdout()Pipe | ChuỗiLấy luồng đầu ra của tác vụ. Có thể trả về "std", "/dev/null", đường dẫn tệp hoặc đối tượng pipe
:set_stderr(error_stream)Pipe | ChuỗiĐặt luồng lỗi của tác vụ. Tham số có thể là "std", "/dev/null", đường dẫn tệp hoặc đối tượng pipe. Phát sinh lỗi nếu gọi sau khi đã khởi chạy tác vụ
:stderr()Pipe | ChuỗiLấy luồng lỗi của tác vụ. Có thể trả về "std", "/dev/null", đường dẫn tệp hoặc đối tượng pipe
:set_work_dir(directory)ChuỗiĐặt thư mục làm việc của tác vụ. Phát sinh lỗi nếu gọi sau khi đã khởi chạy tác vụ
:work_dir()ChuỗiLấy thư mục làm việc của tác vụ
:set_env(environment_variables)BảngĐặt từ điển khóa-giá trị biến môi trường của tác vụ. Phát sinh lỗi nếu gọi sau khi đã khởi chạy tác vụ
:env()BảngLấy từ điển khóa-giá trị biến môi trường của tác vụ
:pid()Số nguyênLấy ID tiến trình của tác vụ; trả về 0 nếu tác vụ chưa được khởi chạy
:is_running()BooleanKiểm tra tác vụ có đang chạy hay không. Ngay cả khi :is_running() trả về false, vẫn nên gọi :wait_until_exit() một lần trên tác vụ để tránh tiến trình zombie
:interrupt()BooleanGửi tín hiệu SIGINT đến tiến trình chính của tác vụ
:terminate()BooleanGửi tín hiệu SIGTERM đến tiến trình chính của tác vụ
:kill()BooleanGửi tín hiệu SIGKILL đến mọi tiến trình của tác vụ; thao tác kết thúc được tự động thực hiện khi đối tượng tác vụ bị thu gom rác
:termination_status()Số nguyênLấy trạng thái kết thúc của tác vụ; trả về nil, error_message nếu tác vụ chưa kết thúc
:termination_reason()ChuỗiLấy lý do kết thúc của tác vụ; trả về nil, error_message nếu tác vụ chưa kết thúc

Phương thức của đối tượng pipe

Phương thứcTham sốGiá trị trả vềMô tả
:read()ChuỗiĐọc dữ liệu hiện có từ pipe
:write(data)ChuỗiGhi dữ liệu vào pipe
:wclose()Boolean, nil | ChuỗiĐóng đầu ghi của pipe; trả về true khi thành công, false, error_message khi thất bại
:rclose()Boolean, nil | ChuỗiĐóng đầu đọc của pipe; trả về true khi thành công, false, error_message khi thất bại

Mô tả

Tạo một tác vụ thực thi và trả về đối tượng tác vụ thực thi
Nếu không muốn chặn tất cả luồng để chờ tác vụ, có thể dùng vòng lặp với :is_running() của đối tượng tác vụ để kiểm tra tác vụ có đang chạy hay không. Khi tác vụ không còn chạy, hãy gọi :wait_until_exit() một lần để xác nhận tác vụ đã kết thúc
Khả dụng trong các phiên bản sau 20250705.

Ví dụ

-- Mô phỏng lệnh shell sau
-- echo "Xin chào thế giới" | /usr/bin/gzip -fc | /usr/bin/gzip -dfc

local comp_tsk = sys.task(jbroot('/usr/bin/gzip'), '-fc') -- Tạo tác vụ nén
local decomp_tsk = sys.task(jbroot('/usr/bin/gzip'), '-dfc') -- Tạo tác vụ giải nén

decomp_tsk:set_stdin(comp_tsk:stdout()) -- Đặt luồng đầu vào của tác vụ giải nén thành luồng đầu ra của tác vụ nén

decomp_tsk:launch() -- Khởi chạy tác vụ giải nén
comp_tsk:launch() -- Khởi chạy tác vụ nén

comp_tsk:stdin():write("Xin chào thế giới") -- Ghi dữ liệu vào luồng đầu vào của tác vụ nén
comp_tsk:stdin():wclose() -- Đóng đầu ghi của luồng đầu vào tác vụ nén để báo hiệu đã nhập xong

comp_tsk:wait_until_exit() -- Chờ tác vụ nén hoàn tất
decomp_tsk:wait_until_exit() -- Chờ tác vụ giải nén hoàn tất

nLog(decomp_tsk:stdout():read()) -- Đọc luồng đầu ra của tác vụ giải nén, cho kết quả "Xin chào thế giới"

Ví dụ (Gọi làm mới Trình trợ giúp duy trì TrollStore)

local persistence_helper_path = app.bundle_path('com.apple.tips')
if not persistence_helper_path then
nLog('Không phát hiện Tips.app, trước tiên hãy cài đặt ứng dụng Tips từ App Store')
return
end
local root_helper_path = persistence_helper_path..'/trollstorehelper'
if file.exists(root_helper_path) ~= 'file' then
nLog('Trình trợ giúp duy trì TrollStore chưa được chèn vào Tips; hãy mở TrollStore -> Cài đặt -> Cài đặt Trình trợ giúp duy trì rồi chọn Tips để chèn')
return
end
local tsk = sys.task(root_helper_path, 'refresh')
tsk:launch()
tsk:wait_until_exit()
sys.killall(9, 'SpringBoard', 'backboardd')

Ví dụ (Dùng TrollStore để cài đặt/gỡ cài đặt ứng dụng và tạo lại bộ nhớ đệm biểu tượng)

local function _trollstorehelper(...)
local troll_path = app.bundle_path('com.opa334.TrollStore')
assert(type(troll_path) == 'string', 'Cần cài đặt TrollStore.')
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

--- Cài đặt ứng dụng bằng TrollStore
---@param ipapath string Đường dẫn đến gói cài đặt
---@return string? Văn bản kết quả cài đặt, trả về nil khi thất bại
---@return string? Thông báo lỗi, trả về nil khi thành công
function troll_install(ipapath)
return _trollstorehelper('install', ipapath)
end

--- Gỡ cài đặt ứng dụng đã được TrollStore cài đặt
---@param bid string Mã định danh gói ứng dụng
---@return string? Văn bản kết quả gỡ cài đặt, trả về nil khi thất bại
---@return string? Thông báo lỗi, trả về nil khi thành công
function troll_uninstall(bid)
return _trollstorehelper('uninstall', bid)
end

--- Dùng TrollStore tạo lại bộ nhớ đệm biểu tượng; có thể mất một khoảng thời gian
---@return string? Văn bản kết quả tạo lại, trả về nil khi thất bại
---@return string? Thông báo lỗi, trả về nil khi thành công
function troll_rebuild_icon_cache()
return _trollstorehelper('refresh-all')
end

-- Ví dụ gọi hàm
nLog(troll_install(XXT_SCRIPTS_PATH..'/TrollDecrypt.tipa')) -- Cài đặt TrollDecrypt
nLog(troll_uninstall('com.fiore.trolldecrypt')) -- Gỡ cài đặt TrollDecrypt
nLog(troll_rebuild_icon_cache()) -- Tạo lại bộ nhớ đệm biểu tượng