也發布在 PerlMonks 上。
我的 linux 服務器上有這個非常簡單的 Perl 腳本。
我想做的是從另一臺機器上的瀏覽器呼叫腳本
讓腳本啟動一個分叉
讓父母發送一個httpResponse(釋放瀏覽器)
立即結束父母
讓孩子做它的作業, 繁重的復雜資料庫作業,可能需要一兩分鐘
讓孩子結束自己而沒有任何輸出
當我從瀏覽器呼叫此腳本時,瀏覽器在孩子完成之前不會收到發送的回應。
是的,它在從命令列呼叫時有效。
我想做的事可能嗎?ps 我什至用 ProcSimple 嘗試過,但同樣掛斷。
#!/usr/bin/perl
local $SIG{CHLD} = "IGNORE";
use lib '/var/www/cgi-bin';
use CGI;
my $q = new CGI;
if(!defined($pid = fork())) {
die "Cannot fork a child: $!";
} elsif ($pid == 0) {
print $q->header();
print "i am the child\n";
sleep(10);
print "child is done\n";
exit;
} else {
print $q->header();
print "I am the parent\n";
print "parent is done\n";
exit 0;
}
exit 0;
uj5u.com熱心網友回復:
父行程啟動另一個自行運行的行程的一種方法是“雙分叉”。孩子本身分叉,然后立即退出,因此它的孩子被 init 接管,不能成為僵尸。
這在這里可能會有所幫助,因為檔案描述符在父子之間共享,這似乎確實存在阻塞,正如評論中提到的那樣。如果孩子要快速退出,這可能會起作用,但是由于您需要一個長時間運行的作業的行程,那么 fork 兩次
use warnings;
use strict;
use feature 'say';
my $pid = fork // die "Can't fork: $!";
if ($pid == 0) {
say "\tChild. Fork";
my $ch_pid = fork // die "Can't fork from child: $!";
if ($ch_pid == 0) {
# grandchild, run the long job
sleep 10;
say "\t\tgrandkid done";
exit;
}
say "\tChild, which just forked, exiting right away.";
exit;
}
say "Parent, and done";
我不確定如何模擬您的設定以測驗這是否有幫助,但既然您說孩子“沒有任何輸出”,這可能就足夠了。這應該值得一試,因為它比妖魔化程序更簡單(我希望能做到這一點)。
uj5u.com熱心網友回復:
通常,您必須將子行程與其父行程分離以允許父行程干凈地退出——否則父行程不能假定它不需要處理更多的輸入/輸出。
} elsif ($pid == 0) {
close STDIN;
close STDERR;
close STDOUT; # or redirect
do_long_running_task();
exit;
在您的示例中,子行程正在執行print
陳述句,直到它退出。如果父行程已經被殺死并關閉了它的 I/O 句柄,這些列印會去哪里?
uj5u.com熱心網友回復:
與@mob 的帖子類似,這是我的網路應用程式的做法:
# fork long task
if (my $pid = fork) {
# parent: return with http response to web client
} else {
# child: suppress further IO to ensure termination of http connection to client
open STDOUT, '>', "/dev/null";
open STDIN, '>', "/dev/null";
open STDERR, '>', "/dev/null";
}
# Child carries on from here,
有時,(子)長行程會列印到 Web 客戶端可能會查看的信號量或狀態檔案,以查看長行程何時完成。
我不記得幾年前是哪個 Perl 專家建議的,但它在許多情況下都可靠地服務,并且從“多年后重新訪問它 - 我在做什么?”中看起來非常清楚。看法...
請注意,如果 /dev/null 在 UNIX/Linux 之外不起作用,那么 @mob 對 close 的使用可能更普遍。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464670.html