我有一个使用CGI实现的webapp。它基本上使用system()调用来启动其他程序,结果将以html呈现。
现在,我正在尝试使用Dancer来实现它。为了运行这些外部程序,我在/ MyApp中创建了一个“scripts”目录,就像/ MyApp / scripts一样。我将所有其他脚本放在那里,将在路由处理程序中调用。
get '/analysis' => sub {
if (session('user') && session('logged_in')) {
open FH, "<", "./scripts/test.out";
my $msg = <FH>;
close FH;
chdir ("./scripts");
system("call sth"); #call external programs to generate a "test.png"
my $err;
copy ("test.png", "../public/images/test.png") || ($err = "cannot copy"); #copy the "test.png" to public/images directory, so the
my $img = "test.png";
template 'analysis',{msg => $msg, img => $img, err => $err};
}
else {
return redirect '/'
}
};
但是,我可以成功启动此应用程序或使用plackup / starman。但我不能用CGI部署它。关于cgi部署我使用舞蹈家的文档做了每一步。我可以成功使用cgi来启动舞者的示例应用程序。但是当我试图像上面那样启动我自己的时候,我总是得到错误:
app目录'/ home / tester / MyApp / bin / ..'不可写/可执行,无法在/usr/local/share/perl/5.14.2/Dancer/Logger.pm行chmod它16,referer:localhost
这似乎是一个权限问题,但我不知道如何修复它。有没有更好的方法从路由处理程序启动外部程序?我应该在哪里存储这些外部程序,因此它们可以由舞者应用程序在部署为CGI时执行。
有人能帮帮我吗?感谢。
小宽
答案 0 :(得分:0)
Dancer::Logger::File
documentation说:
可以使用log_path选项指定日志目录。
setting log_path => $dir;
只需在(production.yml)环境文件中添加一行:
log_path: /var/log/dancer/myapp/
并将此路径写入www-data
。