创建一个执行任务 (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()) -- 读取解压任务的输出流,输出 "你好世界"