最近做个小东西,希望前台添加一个任务给后台 cgi,后台返回任务添加完成,然后后台那个进程就自己跑,直到完成,却怎么都不行.我 fork 之后 exec,cgi 还是会等待后台进程结束才会返回数据.
我看不行,直接 fork 之后把后台进程变成守护进程,结果还是不行.......
有人说是因为子进程有标准输入输出,所以不行,我全关闭了,还是不行.....
我使用 python 写的代码如下
https://gist.github.com/yangyaofei/3610de01ba100e930e66
还有一个办法就是后台一直有一个进程,每次有请求的时候执行的脚本给这个进程发信号,这个进程再去做任务,这样好麻烦啊~~实在不行只能那样了是么.......
1
xiamx 2016-02-05 23:34:12 +08:00
在结束前 print "\r\n\r\n"
|
2
xiamx 2016-02-05 23:34:46 +08:00
很好奇楼主在这个时代还在写 cgi 是做什么项目? 作业吗?
|
3
yangyaofei OP @xiamx 没有啊,小白写点东西自己玩啊~ 我去试试
|
4
yangyaofei OP @xiamx 然而并不行~~还有什么叫这个时代啊~~cgi 不是挺好用么~
|
5
ipconfiger 2016-02-05 23:40:00 +08:00
难道我穿越了?
|
6
yangyaofei OP @ipconfiger 虽然很小白的问题,也不至于如此嘲讽吧.......
|
7
bdbai 2016-02-05 23:54:53 +08:00 via iPhone
我觉得可以用队列来完成,前台负责压任务进去,后台程序负责消费。坐等楼下大神
|
8
yangyaofei OP @bdbai 我不想那样做,会写一堆代码,而且后台进程还有手动启动,不能从 web 上,不爽
|
9
SoloCompany 2016-02-06 01:58:31 +08:00 via iPhone
父进程需要等待子进程退出自己才退出的,试试用 nohup
|
10
bdbai 2016-02-06 08:59:57 +08:00 via iPhone
@yangyaofei 按照 RabbitMQ 官方教程,不会多太多代码。
|
11
oott123 2016-02-06 10:43:44 +08:00
用 web 做不是不可以,但用 cgi 做,我是没想到正常的方法。
你可以考虑设置 Connection: close 和 Content-Length 两个头,让目标浏览器主动断开连接。 但这样一来,你的 HTTP 服务器还会不会保留 cgi 进程是个未知数了,尝试一下咯。 |
12
picasso250 2016-02-06 11:30:52 +08:00 1
> 我不想那样做,会写一堆代码,而且后台进程还有手动启动,不能从 web 上,不爽
楼主你就继续任性吧。你开心就好。 |
13
yangyaofei OP |
14
firemiles 2016-02-06 17:18:56 +08:00
写一个进程专门接受 cgi 的消息,然后启动任务,这样 cgi 就能直接返回了。
|
15
hythyt9898 2016-02-07 15:00:43 +08:00
好吧,我遇到过这个,我的 CGI 是 C 实现的, fork 后的后台进程关闭 0 , 1 , 2 , CGi 就能返回了。
|
16
yangyaofei OP |
17
firemiles 2016-02-07 19:46:26 +08:00
我不太清楚为什么子进程不结束就不行的原因,所以直接单独先开一个守护进程,接收 cgi 发过来的命令产生新任务, cgi 就不用 fork 进程了,应该不会遇到子进程的问题。
|
18
yangyaofei OP @firemiles 哦~~看来和我想的差不多,我写个 socket 服务器做守护进程,发送命令让他在后台执行.
|
19
hythyt9898 2016-02-08 00:48:14 +08:00
pid = fork();
if (!pid) { for (i = 0; i < 3; i++) close(i); // daemon job } // cgi return |
20
yangyaofei OP @hythyt9898 fork 不管用………
|
21
zyAndroid 2016-02-08 15:02:06 +08:00
你需要个任务队列来做这种事情
|
22
yangyaofei OP @zyAndroid 哦~~我已经自己在造轮子了......用 socket 做个守护进程还行,反正我用的简单,自己实现了,要是以后不行了,在用那个吧 谢谢 长知识了
|
23
leeyiw 2016-02-08 23:42:42 +08:00
如果用 Python 的话可以试试 Celery ,就是可能重了点。
|