跳到主要内容

创建一个执行任务 (sys.task)

声明

任务 = sys.task(可执行文件路径 [, 参数...])

参数

  • 可执行文件路径
    文本型
  • 参数...
    文本型,可选不定参数,默认没有

返回值

  • 任务
    执行任务对象,返回一个控制任务或执行任务的对象

任务对象方法列表

方法参数返回值说明
:launch()启动任务,异步运行
:wait_until_exit()同步等待任务结束,任务结束前会阻塞所有线程。
:set_stdin(输入流)管道 | 文本型设置任务的输入流。参数可以是 "std""/dev/null"、文件路径、管道对象。任务启动后再调用将抛出错误
:stdin()管道 | 文本型获取任务的输入流。可能返回 "std""/dev/null"、文件路径、管道对象
:set_stdout(输出流)管道 | 文本型设置任务的输出流。参数可以是 "std""/dev/null"、文件路径、管道对象。任务启动后再调用将抛出错误
:stdout()管道 | 文本型获取任务的输出流。可能返回 "std""/dev/null"、文件路径、管道对象
:set_stderr(错误流)管道 | 文本型设置任务的错误流。参数可以是 "std""/dev/null"、文件路径、管道对象。任务启动后再调用将抛出错误
:stderr()管道 | 文本型获取任务的错误流。可能返回 "std""/dev/null"、文件路径、管道对象
:set_work_dir(目录)文本型设置任务的工作目录。任务启动后再调用将抛出错误
:work_dir()文本型获取任务的工作目录
:set_env(环境变量)表型设置任务的环境变量键值词典。任务启动后再调用将抛出错误
:env()表型获取任务的环境变量键值词典
:pid()整数型获取任务的进程号,任务启动前获取返回 0
:is_running()布尔型判断任务是否正在运行。即使 :is_running() 返回 false,也应当对任务调用一次 :wait_until_exit() 以阻止产生僵尸进程
:interrupt()布尔型向任务主进程发送终止 SIGINT 信号
:terminate()布尔型向任务主进程发送终止 SIGTERM 信号
:kill()布尔型向任务所有进程发送强杀 SIGKILL 信号,任务对象被回收时会自动执行 kill 操作
:termination_status()整数型获取任务的终止状态,如果任务尚未结束则返回 nil, 错误信息
:termination_reason()文本型获取任务的终止原因,如果任务尚未结束则返回 nil, 错误信息

管道对象方法列表

方法参数返回值说明
:read()字符串型从管道中读取已经准备好的数据
:write(数据)字符串型向管道中写入数据
:wclose()布尔型, nil | 文本型关闭管道写端,成功返回 true,失败返回 false, 错误信息
:rclose()布尔型, nil | 文本型关闭管道读端,成功返回 true,失败返回 false, 错误信息

说明

创建一个执行任务,返回一个执行任务对象
如果不想阻塞所有线程等待任务,可循环使用任务对象的 :is_running() 来判断任务是否正在运行,如果不在运行了,则可使用一次 :wait_until_exit() 来确认任务已经结束
这个函数在 20250705 以后版本方可使用

示例

-- 模拟以下 Shell 命令
-- echo "你好世界" | /usr/bin/gzip -fc | /usr/bin/gzip -dfc

local comp_tsk = sys.task(jbroot('/usr/bin/gzip'), '-fc') -- 创建压缩任务
local decomp_tsk = sys.task(jbroot('/usr/bin/gzip'), '-dfc') -- 创建解压任务

decomp_tsk:set_stdin(comp_tsk:stdout()) -- 设置解压任务的输入流为压缩任务的输出流

decomp_tsk:launch() -- 启动解压任务
comp_tsk:launch() -- 启动压缩任务

comp_tsk:stdin():write("你好世界") -- 向压缩任务的输入流写入数据
comp_tsk:stdin():wclose() -- 关闭压缩任务的输入流写端,表示输入流已经结束

comp_tsk:wait_until_exit() -- 等待压缩任务结束
decomp_tsk:wait_until_exit() -- 等待解压任务结束

nLog(decomp_tsk:stdout():read()) -- 读取解压任务的输出流,输出 "你好世界"