我是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 &");
答案 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_CLOEXEC
与fcntl
一起使用(如果您保留现有的system
调用而不是更改为显式的fork / exec,那么这甚至可能有效。)
根据网络服务器的不同,您可能需要做其他事情(例如,成为POSIX::setsid
的会话负责人。
所有这些都可以通过Proc::Daemon
模块为您完成。
我建议您同时查看IPC::Run3
,尤其是当您想捕获scp
输出并将其发送到浏览器时。它允许您轻松地将输出恢复为标量,然后您可以轻松地格式化和打印。
答案 1 :(得分:0)
这可能会有所帮助: scp as a background process
对于perl,还有另一个问题: