Команды Linux (cp, rm) не выполняются в сценарии perl. Некоторые работы. Но ошибки не возвращаются - PullRequest
0 голосов
/ 28 февраля 2012

У меня очень странная ошибка.

Я запускаю Perl-скрипт, который выполняет команды Linux. Они выполнены так:

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

И $ err пусто, что означает, что команда не вернула ошибку. (Правильно?)

Я пытался выполнить команду linux с помощью exec "" или system (), но безуспешно. Я пытался изменить путь. То же самое.

Кроме того, я попытался запустить только команду cp в новом скрипте perl. Оно работает. Но не в моем полном сценарии на Perl.

В этом сценарии perl некоторые команды работают, некоторые нет.

Сценарий работал вчера, а не сегодня утром. За это время не было внесено никаких изменений.

Я много чего перепробовал, был бы рад, если у кого-нибудь есть идея.

EDIT: На сервере было много незавершенных процессов. Очистка тех, кто решил проблему. Так что проблема связана с другим приложением, но я улучшу ведение журнала благодаря вашим комментариям.

Ответы [ 3 ]

5 голосов
/ 28 февраля 2012

Небольшая проблема: вы НЕ захватываете STDERR, поэтому вы не увидите ошибку (вы также не проверяете $? код возврата).

Вы должны сделать

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

чтобы перенаправить STDERR в STDOUT или использовать один из модулей для запуска команд.


Большая проблема:

Вы не должны запускать системные команды из Perl, для которых существуют собственные модули Perl. В этом случае: File::Copy::Recursive модуль.

Вы также можете свернуть свой каталог , скопированный с File::Copy.

1 голос
/ 28 февраля 2012

Используете ли вы backticks? Добавьте -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

0 голосов
/ 05 июня 2014

Вы также можете заключить в кавычки аргументы, которые могут содержать любые специальные символы оболочки, включая пробелы. Поскольку shell будет выполнять разбиение слов по заданной ей строке, если $HTML содержит пробел, cp получит больше аргументов, чем вы ожидаете. Perl имеет очень простой механизм для этого: \Q\E. Вот как вы это делаете:

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

Все, кроме буквенно-цифровых символов, будет экранировано от обратной косой черты перед передачей в оболочку. И вы должны предоставить ровно 2 аргумента для cp независимо от того, что находится в этих переменных.

...