V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
yangyaofei
V2EX  ›  程序员

如何让 cgi 提交后运行一个后台任务,然后后台立刻返回呢?

  •  
  •   yangyaofei ·
    yangyaofei · Feb 5, 2016 · 4837 views
    This topic created in 3744 days ago, the information mentioned may be changed or developed.

    最近做个小东西,希望前台添加一个任务给后台 cgi,后台返回任务添加完成,然后后台那个进程就自己跑,直到完成,却怎么都不行.我 fork 之后 exec,cgi 还是会等待后台进程结束才会返回数据.

    我看不行,直接 fork 之后把后台进程变成守护进程,结果还是不行.......

    有人说是因为子进程有标准输入输出,所以不行,我全关闭了,还是不行.....

    我使用 python 写的代码如下

    https://gist.github.com/yangyaofei/3610de01ba100e930e66

    还有一个办法就是后台一直有一个进程,每次有请求的时候执行的脚本给这个进程发信号,这个进程再去做任务,这样好麻烦啊~~实在不行只能那样了是么.......

    23 replies    2016-02-08 23:42:42 +08:00
    xiamx
        1
    xiamx  
       Feb 5, 2016
    在结束前 print "\r\n\r\n"
    xiamx
        2
    xiamx  
       Feb 5, 2016
    很好奇楼主在这个时代还在写 cgi 是做什么项目? 作业吗?
    yangyaofei
        3
    yangyaofei  
    OP
       Feb 5, 2016
    @xiamx 没有啊,小白写点东西自己玩啊~ 我去试试
    yangyaofei
        4
    yangyaofei  
    OP
       Feb 5, 2016   ❤️ 1
    @xiamx 然而并不行~~还有什么叫这个时代啊~~cgi 不是挺好用么~
    ipconfiger
        5
    ipconfiger  
       Feb 5, 2016
    难道我穿越了?
    yangyaofei
        6
    yangyaofei  
    OP
       Feb 5, 2016
    @ipconfiger 虽然很小白的问题,也不至于如此嘲讽吧.......
    bdbai
        7
    bdbai  
       Feb 5, 2016 via iPhone
    我觉得可以用队列来完成,前台负责压任务进去,后台程序负责消费。坐等楼下大神
    yangyaofei
        8
    yangyaofei  
    OP
       Feb 6, 2016
    @bdbai 我不想那样做,会写一堆代码,而且后台进程还有手动启动,不能从 web 上,不爽
    SoloCompany
        9
    SoloCompany  
       Feb 6, 2016 via iPhone
    父进程需要等待子进程退出自己才退出的,试试用 nohup
    bdbai
        10
    bdbai  
       Feb 6, 2016 via iPhone
    @yangyaofei 按照 RabbitMQ 官方教程,不会多太多代码。
    oott123
        11
    oott123  
       Feb 6, 2016
    用 web 做不是不可以,但用 cgi 做,我是没想到正常的方法。
    你可以考虑设置 Connection: close 和 Content-Length 两个头,让目标浏览器主动断开连接。
    但这样一来,你的 HTTP 服务器还会不会保留 cgi 进程是个未知数了,尝试一下咯。
    picasso250
        12
    picasso250  
       Feb 6, 2016   ❤️ 1
    > 我不想那样做,会写一堆代码,而且后台进程还有手动启动,不能从 web 上,不爽

    楼主你就继续任性吧。你开心就好。
    yangyaofei
        13
    yangyaofei  
    OP
       Feb 6, 2016 via Android
    @picasso250 找了很多发现实在不行………准备做一个 sockts 服务器来做这个了

    @bdbai
    firemiles
        14
    firemiles  
       Feb 6, 2016
    写一个进程专门接受 cgi 的消息,然后启动任务,这样 cgi 就能直接返回了。
    hythyt9898
        15
    hythyt9898  
       Feb 7, 2016
    好吧,我遇到过这个,我的 CGI 是 C 实现的, fork 后的后台进程关闭 0 , 1 , 2 , CGi 就能返回了。
    yangyaofei
        16
    yangyaofei  
    OP
       Feb 7, 2016 via Android
    @firemiles 不懂啥意思,求细说

    @hythyt9898 返回 012 ?是父进程返回?还是? exit(0123)都试过了………子进程不结束不行啊
    firemiles
        17
    firemiles  
       Feb 7, 2016
    我不太清楚为什么子进程不结束就不行的原因,所以直接单独先开一个守护进程,接收 cgi 发过来的命令产生新任务, cgi 就不用 fork 进程了,应该不会遇到子进程的问题。
    yangyaofei
        18
    yangyaofei  
    OP
       Feb 7, 2016
    @firemiles 哦~~看来和我想的差不多,我写个 socket 服务器做守护进程,发送命令让他在后台执行.
    hythyt9898
        19
    hythyt9898  
       Feb 8, 2016
    pid = fork();
    if (!pid) {
    for (i = 0; i < 3; i++)
    close(i);
    // daemon job
    }
    // cgi return
    yangyaofei
        20
    yangyaofei  
    OP
       Feb 8, 2016 via Android
    @hythyt9898 fork 不管用………
    zyAndroid
        21
    zyAndroid  
       Feb 8, 2016
    你需要个任务队列来做这种事情
    yangyaofei
        22
    yangyaofei  
    OP
       Feb 8, 2016
    @zyAndroid 哦~~我已经自己在造轮子了......用 socket 做个守护进程还行,反正我用的简单,自己实现了,要是以后不行了,在用那个吧 谢谢 长知识了
    leeyiw
        23
    leeyiw  
       Feb 8, 2016
    如果用 Python 的话可以试试 Celery ,就是可能重了点。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3208 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 57ms · UTC 00:20 · PVG 08:20 · LAX 17:20 · JFK 20:20
    ♥ Do have faith in what you're doing.