perl cron作业中的用户ID

时间:2013-05-23 20:04:04

标签: perl cron crontab userid

我有一个以cron作为运行的Perl脚本(每分钟)。现在,我在我的文件中进行某些计算和执行。每当作业运行时,它都无法访问文件系统中的某些文件夹。

例如,我有一个名为/opt/tinyos-2.x/apps/的文件夹。我公开了这个文件夹(获得777许可)。我在Perl脚本中将目录更改为此文件夹并尝试在那里执行文件。但它没有运行,相反我得到错误说:

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

每当我转到该文件夹​​并以sudo身份执行文件时,我都可以复制此错误。

  1. 所以,我假设我的cron以某种方式成为“root”(我的cron与上面的文件夹所有者在同一个用户下)。那么我该怎么办这个问题呢?

  2. 我觉得如果我能够获得当前在该Perl脚本中运行的用户,我可能会发现它是用户ID。谁能告诉我如何在Perl脚本中获取用户ID?在各个地方检查后,我发现此解决方案知道用户ID - print $ENV{"LOGNAME"}。这是在cron job运行的Perl脚本中了解用户的正确方法吗?

  3. 以下是我所拥有的: 我有一个用户ID“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中运行时,我看不到任何输出或发生任何事情。我收到用户ID位置/ 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。

    有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

这对我有用。哪个应该回答问题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

STDERRSTDOUT重定向到您的日志文件不会有任何问题。

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

答案 1 :(得分:0)

  • 是什么让你认为这与perl有关?
  • 是什么让你认为cron改变了你的UID?
  • 是什么让您认为这是许可问题?

我的猜测是来自你的shell,你使用的是不同的make二进制文件而不是你的cron作业。您的cron工作中使用了PATH,请尝试以下方法:

$ which make

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

如果您得到两个不同的结果,则需要编辑您的cron标签,以便它可以使用您在shell中使用的PATH