我有一个非常奇怪的错误。
我运行一个执行linux命令的perl脚本。它们的执行方式如下:
my $err = `cp -r $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1`;
myLog("$err");
并且$ err为空,这意味着命令没有返回并且错误。 (右?)
我尝试用exec“”或system()执行linux命令,但没有成功。 我试图改变路径。相同。
另外,我试图在新的perl脚本中只运行cp命令。有用。 但不是我的完整perl脚本。
在这个perl脚本中,有些命令正在运行,有些则没有。
脚本昨天正在工作,今天早上不再了。在此期间没有任何变化。
我做了很多事情,如果有人有想法,我会很高兴。
编辑: 服务器有很多未终止的进程。清洁那些解决了问题。 所以问题与另一个应用程序有关,但是由于你的意见,我会改进日志记录。
答案 0 :(得分:5)
小问题:您没有捕获STDERR,因此您不会看到错误(您也没有检查$?
返回代码)。
你应该做
my $err = `cp -r $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1 2>&1`;
将STDERR重定向到STDOUT,或使用其中一个模块运行命令。
大问题:
您不应该从Perl运行Perl-native模块所存在的系统命令。在这种情况下:File::Copy::Recursive
模块。
您还可以从File::Copy
复制roll your own目录。
答案 1 :(得分:1)
你在使用反引号吗?将-v添加到cp命令以查看STDOUT中的内容并将STDERR重定向到STDOUT并检查cmd exitcode而不是STDERR中的错误消息。
如何在执行后立即打印出命令输出?
my $err = `cp -rv $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1 2>&1`;
my $exitcode = $? >> 8;
warn "Output: $err\nexitcode: $exitcode\n";
使用qx会更好。检查一下:http://www.perlmonks.org/?node_id=454715
答案 2 :(得分:0)
您可能还想引用可能包含任何shell特殊字符(包括空格)的参数。由于shell会对赋予它的字符串进行分词,如果$HTML
包含空格cp
,则会获得比预期更多的参数。 Perl的机制非常简单:\Q\E
。这是你如何做到的:
my $err = `cp -r \Q$HTML\E \Q/tssobe/www/tstweb/$subpath/$HTMLDIR1\E 2>&1`;
除了字母数字之外的任何内容都会在将其传递给shell之前进行反斜杠转义。而且,无论这些变量是什么,你都会向cp
提供2个参数。