Как запустить скрипт оболочки из скрипта Perl, запущенного cron? - PullRequest
2 голосов
/ 05 января 2010

Можно ли запустить скрипт Perl (vas.pl) со скриптом оболочки внутри (date.sh & backlog.sh) в cron или наоборот? Спасибо.

 0 19 * * * /opt/perl/bin/perl /reports/daily/scripts/vas_rpt/vasCIO.pl 2> /reports/daily/scripts/vas_rpt/vasCIO.err

Произошла ошибка:

 date.sh: not found
 backlog.sh: not found

Perl-скрипт:

#!/opt/perl/bin/perl

system("sh date.sh");
open(FH,"/reports/daily/scripts/vas_rpt/date.txt");
@date = <FH>;

close FH;

open(FH,"/reports/daily/scripts/vas_rpt/$cat1.txt");
@array = <FH>;

system("sh backlog.sh $date[0] $array[0]");

close FH;

Ответы [ 4 ]

8 голосов
/ 05 января 2010

cron запускает ваш Perl-скрипт в другом рабочем каталоге, чем ваш текущий рабочий каталог. Используйте полный путь к вашему файлу скрипта:

# I'm assuming your shell script reside in the same
# dir as your perl script:

system("sh /reports/daily/scripts/date.sh");

Или, если у вас аллергия на пути жесткого кодирования, как я, вы можете использовать пакет FindBin от CPAN:

use FindBin qw($Bin);
system("sh $Bin/date.sh");

Если ваш сценарий оболочки также должен запускаться по правильному пути, то, вероятно, лучше сначала изменить ваш рабочий каталог:

use FindBin qw($Bin);
chdir $Bin;
system("sh date.sh");
3 голосов
/ 05 января 2010

Вы можете делать, что хотите, если вы осторожны.

Первое, что следует помнить при cron заданиях, это то, что вы почти не устанавливаете среду.

Скорее всего, текущий каталог / или, возможно, $HOME. И значение $ PATH минимально - ваш профиль не был запущен, например.

Итак, ваш скрипт не нашел 'date.sh', потому что он не был в правильном каталоге.

Чтобы получить данные из сценария оболочки в вашу программу, вам нужно передать их туда или организовать 'date.sh' для успешного сброса данных в файл. Конечно, Perl имеет встроенную обработку даты и времени, поэтому вам не нужно использовать оболочку для него.

Вы также не работали с use warnings; или use strict;, что также помогло бы вам. Например, $cat1 не является определенной переменной.

Лично я запускаю простой сценарий оболочки из cron и позволяю ему разобраться со всеми сложностями; Я не использую перенаправление ввода / вывода в файле crontab. Это отчасти наследие работы с древними системами, но оно также ведет к переносимому и надежному выполнению cron заданий.

2 голосов
/ 05 января 2010

Это возможно. Просто имейте в виду, что ваш рабочий каталог при работе в cron может отличаться от того, что вы думаете - это значение в переменной окружения HOME или значение, указанное в файле / etc / passwd. Подумайте о том, чтобы полностью уточнить путь к вашим .shes.

0 голосов
/ 05 января 2010

В вашем сценарии есть много вещей, которые нуждаются в заботе, и о большинстве из них я рассказываю в главе "1001 * Мастеринг Perl " "Методы безопасного программирования". Вы также можете найти некоторые из них в perlsec /

Поскольку вы берете внешние данные и передаете их другим внешним программам, вам следует использовать проверку заражения, чтобы убедиться, что данные соответствуют вашим ожиданиям. Что если бы кто-нибудь смог проникнуть в эти файлы что-то еще?

Если вы хотите передать данные во внешние программы, используйте system в форме списка, чтобы у оболочки не было возможности интерпретировать возможные метасимволы.

Вместо того чтобы полагаться на PATH при поиске программ, которые вы ожидаете запустить, укажите их полные пути в явном виде, чтобы убедиться, что вы, по крайней мере, запускаете файл, который вам кажется (а не кем-то, кто проник в каталог, ранее в PATH). Если вы действительно были параноиком (например, проверка на зараженность), вы также можете проверить, что эти файлы и каталоги имеют соответствующие разрешения (например, не доступны для записи).

Так же, как бонусная заметка, если вам нужна только одна строка из дескриптора файла, вы можете использовать оператор ввода строки в скалярном контексте:

 my $date = <$fh>;

Вы, вероятно, тоже хотите сжать данные, чтобы избавиться от возможных завершающих строк новой строки. Даже если вы не думаете, что должен быть завершающий символ новой строки, потому что файл был создан другой программой, кто-то, просматривающий файл в текстовом редакторе, может добавить его.

Удачи,:)

...