0

我有一个非常奇怪的错误。

我运行一个执行 linux 命令的 perl 脚本。它们是这样执行的:

my $err = `cp -r $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1`;
myLog("$err");

并且 $err 是空的,这意味着命令没有返回和错误。(正确的?)

我尝试使用 exec "" 或 system() 执行 linux 命令,但没有成功。我试图改变路径。相同的。

另外,我尝试在新的 perl 脚本中只运行 cp 命令。有用。但不在我的完整 perl 脚本中。

在这个 perl 脚本中,有些命令可以工作,有些不能。

脚本昨天还在工作,今天早上就不行了。在此期间没有进行任何更改。

我尝试了很多东西,如果有人有想法,我会很高兴。

编辑:服务器有很多未终止的进程。清理这些解决了问题。所以问题与另一个应用程序有关,但由于您的评论,我会改进日志记录。

4

3 回答 3

5

小问题:您没有捕获 STDERR,因此您不会看到错误(您也没有检查$?返回码)。

你应该做

my $err = `cp -r $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1 2>&1`;

将 STDERR 重定向到 STDOUT,或使用其中一个模块来运行命令。


大问题:

对于存在 Perl 原生模块的 Perl,您不应该运行系统命令。在这种情况下:File::Copy::Recursive模块。

您还可以滚动您自己的目录,从File::Copy.

于 2012-02-28T11:01:17.077 回答
1

你在使用反引号吗?将 -v 添加到 cp 命令以查看 STDOUT 中的内容并将 STDERR 重定向到 STDOUT 并检查 cmd 退出代码而不是 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

于 2012-02-28T11:00:49.840 回答
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 个参数。

于 2014-06-05T02:51:22.967 回答