使用Perl CGI在后台运行SAP

时间:2012-01-12 11:25:08

标签: perl cgi

我是Run Perl CGI脚本。我正在运行SCP Command。但我希望将该命令运行到后台并退出脚本。但Still网页等待完成脚本。 我喜欢这样:

system ("scp -r machinename:/path/to/file/for/copy/ /path/for/destination/directory/  &");

但它没有正常工作。它还在等待完成脚本。 请帮帮我。

并告诉我如何使用Perl CGI在网页上输出SCP:我这样做:

system ("scp -r machinename:/path/to/file/for/copy/ /path/for/ destination/directory/ 2>&1 &");

2 个答案:

答案 0 :(得分:1)

当您在CGI中运行时,标准文件句柄(STDIN,STDOUT,STDERR)都将返回到Web服务器。您需要在子进程中关闭它们:

my $pid = fork();
if (! defined $pid) {
    ...
} elsif (0 == $pid) {
    # child
    close(STDIN);
    close(STDOUT);
    chose(STDERR);
    exec { 'scp' } 'scp', 'file', 'user@host:/path/to/file';
} else {
    ...
}

或者,您可以在更有用的位置重新打开它们(例如,从/ dev / null,STDOUT和STDERR到您自己的日志文件的STDIN):

open STDIN, '<', '/dev/null'
    or confess "Failed to reopen STDIN";

您还可以将FD_CLOEXECfcntl一起使用(如果您保留现有的system调用而不是更改为显式的fork / exec,那么这甚至可能有效。)

根据网络服务器的不同,您可能需要做其他事情(例如,成为POSIX::setsid的会话负责人。

所有这些都可以通过Proc::Daemon模块为您完成。

我建议您同时查看IPC::Run3,尤其是当您想捕获scp输出并将其发送到浏览器时。它允许您轻松地将输出恢复为标量,然后您可以轻松地格式化和打印。

答案 1 :(得分:0)

这可能会有所帮助: scp as a background process

对于perl,还有另一个问题:

How can I run Perl system commands in the background?