workflow icon indicating copy to clipboard operation
workflow copied to clipboard

请问如何用workflow封装shell命令行指令为任务,并跟踪任务状态

Open eatcosmos opened this issue 6 months ago • 3 comments

使用场景是做一个前端网页版本的编译器,方法就是直接在服务器运行命令,然后把shell命令终端执行结果映射给网页显示, 比如:

  • as -o bootsect.o bootsect.S

  • ld -m elf_x86_64 -Ttext 0x0 -s --oformat binary -o linux.img bootsect.o

  • novnc通过不同的端口映射不同gui软件界面给网页

  • ...

假设有100个用户同时打开浏览器使用,相当于服务器要开100个终端(需要给每个用户分配独有的环境变量,比如分配不同的端口给不同的程序) workflow的任务好像是纯代码的,而终端命令好像是独立进程, workflow需要怎么才能

  1. 像 create_http_task 一样轻松封装 "gcc -o hello hello.c",
  2. 可以封装不同的环境变量到任务里并
  3. 可以跟踪shell命令行的执行状态和返回值用于callback?
  4. 还有一个需求就是,当用户退出浏览器的时候,如何一次性全部销毁workflow调用的全部任务,想的是每个任务都传入一个userid,然后循环监测取消任务,不过感觉workflow应该有更现成的方法实现这个目的?就是比如任务图上有个根节点没了,然后后面的任务自动取消?

直接用类似 os.system() 应该也能达到调用目的,但是做法会比较折腾不够统一,没法用到任务这个抽象,如果这个用任务抽象流程能跑通,以后同类需求就可以复用了,后端的任何形式的操作都可以丢到任务里,而且用了workflow也不用考虑性能问题

eatcosmos avatar Jun 02 '25 17:06 eatcosmos

这个把workflow做出守护进程,shell命令通过unix domain socket和workflow通讯吧。至于如何在用户退出是删除任务,这些都是要写代码实现的。

Barenboim avatar Jun 03 '25 05:06 Barenboim

查了下 unix domain socket 是什么,确实是要的东西,本地也能像网络端口那样了,发现通信全是服务器客户端的模式

eatcosmos avatar Jun 04 '25 02:06 eatcosmos

查了下 unix domain socket 是什么,确实是要的东西,本地也能像网络端口那样了,发现通信全是服务器客户端的模式

其实是否使用uds关系不大,关键问题是把workflow做出守护进程,通过socket和shell进行通讯。你用127.0.0.1地址也可以。

Barenboim avatar Jun 04 '25 07:06 Barenboim