Идентификатор пользователя в задании perl cron

У меня есть сценарий Perl, который выполняется как задание cron (каждую минуту). Теперь я выполняю определенные вычисления и выполнение в своем файле. Всякий раз, когда задание выполняется, оно не получает доступа к некоторым папкам в файловой системе.

Например, у меня есть папка с именем /opt/tinyos-2.x/apps/. Я оставил эту папку общедоступной (с разрешением 777). Я меняю каталог на эту папку в своем Perl-скрипте и пытаюсь выполнять там файлы. Но он не запускается, вместо этого я получаю сообщение об ошибке:

make: *** No rule to make target `telosb'.  Stop. 

Я могу воспроизвести эту ошибку всякий раз, когда захожу в эту папку и запускаю файлы как sudo.

  1. Итак, я предполагаю, что мой cron каким-то образом становится «root» (у меня есть cron под тем же пользователем, что и вышеприведенный владелец папки). Итак, что мне делать с такой проблемой?

  2. Я чувствую, что если я смогу получить пользователя, который в данный момент работает в этом скрипте Perl, я могу найти его идентификатор пользователя. Может ли кто-нибудь сказать мне, как я могу получить идентификатор пользователя в моем сценарии Perl? После проверки в разных местах я нашел это решение, чтобы узнать идентификатор пользователя - print $ENV{"LOGNAME"}. Это правильный способ узнать пользователя в сценарии Perl, запущенном заданием cron?

Вот что у меня есть: у меня есть идентификатор пользователя «abc».

abc@mymachine:crontab -e

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

* * * * * /usr/bin/perl /var/www/web/myfolder/LoadPrograms.pl >> /var/www/web/log.txt

LoadPrograms.pl

#!/usr/bin/perl
use DBI;
use strict;
use Thread;
use File::Path;

$nullPath = "/opt/tinyos-2.x/apps/Null";

chdir($nullPath) or die "cant chnge directory to null directory\n";
my $nullProgramCommand = "make telosb install.1 bsl,/dev/ttyUSB0";

my $output.=`$nullProgramCommand`;
print $output;

Когда моя работа выполняется в cron, я не вижу никаких выходных данных или чего-либо другого. Я получаю почту по идентификатору пользователя /var/mail/abc :

Content-Type: text/plain; charset=ANSI_X3.4-1968
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/abc>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=abc>

make: *** No rule to make target `telosb'.  Stop.

Это означает, что он не запускает мой код в том месте, которое я упомянул: /opt/tinyos-2.x/apps/Null.

Может ли кто-нибудь помочь мне с этим?


person tech_enthusiast    schedule 23.05.2013    source источник
comment
Добавьте в команду отладочный вывод: pwd;env;ls;id;make telosb install.1 bsl,/dev/ttyUSB0 затем запустите ту же последовательность в терминале и сравните результаты. И, возможно, добавьте флаг -d, но будьте осторожны, он выдаст много вывода.   -  person    schedule 24.05.2013
comment
Можете ли вы показать нам содержимое файла Makefile, который, как вы ожидаете, будет использовать ваша команда make, и сказать, где он находится? Я не думаю, что у вас проблемы с Perl или с разрешениями — очень похоже, что Makefile не найден.   -  person James Green    schedule 24.05.2013
comment
Вот содержимое MAkefile: COMPONENT=NullAppC include $(MAKERULES)   -  person tech_enthusiast    schedule 24.05.2013


Ответы (2)


Это работает для меня. Который должен ответить на вопросы 1 и 2. Хотя не совсем понятно, в чем ваша проблема. Похоже, что тоже может быть проблема с путями?

/etc/crontab:

* * * * * cblack /home/cblack/Misc/Tests/test.pl

test.pl:

my $username = $ENV{LOGNAME} || $ENV{USER} || getpwuid($<);
open my $fh, ">>", "testfile";
print $fh scalar(localtime) . "-- testing for $username\n";
close $fh;

/home/cblack/testfile

Thu May 23 13:48:01 2013-- testing for cblack

Не мешало бы перенаправить STDERR и STDOUT в файл журнала.

* * * * * /usr/bin/perl /var/www/web/myfolder/LoadPrograms.pl >> /var/www/web/log.txt 2>&1
person chrsblck    schedule 23.05.2013
comment
Привет, @chrsblck, посмотри мое редактирование выше. Я напечатал идентификатор пользователя, и он показывает мне тот же идентификатор пользователя, под которым я запускаю задание cron. Но моя проблема в том, что мне нужно выполнить файл в определенном месте, и cron не позволяет мне это сделать. Если я перейду вручную в это место и запущу вышеупомянутую команду (сделать telosb install...), она будет работать нормально. Но под cron не работает.. :( - person tech_enthusiast; 24.05.2013
comment
@JModi Хорошо, тогда это должна быть проблема с путями, как я упоминал в своем ответе. - person chrsblck; 24.05.2013

  • Что заставляет вас думать, что это связано с perl?
  • С чего вы взяли, что cron подменил вам UID?
  • Что заставляет вас думать, что это проблема разрешения?

Я предполагаю, что в вашей оболочке вы используете другой двоичный файл make, чем в своем задании cron. У вас есть PATH, используемый в вашем задании cron, поэтому попробуйте следующее:

$ which make

$ PATH=/usr/bin:/bin which make

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

person innaM    schedule 24.05.2013
comment
Это заставило меня задуматься обо всем этом, потому что я шел по слепому пути. Я не знал, что было не так с тем, что я делал. Итак, я пробовал все возможности. В любом случае, я нашел, в чем была проблема. Проблема была с кроном. Когда вы запускаете любое задание как cron, оно не знает переменных среды. Таким образом, вы должны явно экспортировать переменные среды, прежде чем выполнять системные команды. - person tech_enthusiast; 28.05.2013