Cronjob不在perl脚本中执行命令行

时间:2015-08-19 02:27:33

标签: sql linux perl crontab

我对linux / linux环境不熟悉,如果我犯了任何错误,请原谅我,做一些评论澄清。

我创建了一个简单的perl脚本。此脚本创建一个sql文件,如图所示,它将执行要插入数据库的文件中的行。

#!/usr/bin/perl

use strict;
use warnings;
use POSIX 'strftime';

my $SQL_COMMAND;
my $HOST = "i";
my $USERNAME = "need";
my $PASSWORD = "help";
my $NOW_TIMESTAMP = strftime '%Y-%m-%d_%H-%M-%S', localtime;

open my $out_fh, '>>', "$NOW_TIMESTAMP.sql" or die 'Unable to create sql file';

printf {$out_fh} "INSERT INTO BOL_LOCK.test(name) VALUES ('wow');";

sub insert()
{
    my $SQL_COMMAND = "mysql -u $USERNAME -p'$PASSWORD' ";

    while( my $sql_file = glob '*.sql' )
    {
        my $status = system ( "$SQL_COMMAND < $sql_file" );
        if ( $status == 0 )
        {
           print "pass";
        }
        else
        {
           print "fail";
        }
    }
}

insert();

如果我在以用户身份登录时执行它(我无权访问Admin),则此方法有效。但是,当我设置cronjob来运行此文件时,请在上午10点08分使用该行(在crontab -e中):

08 10 * * * perl /opt/lampp/htdocs/otpms/Data_Tsunami/scripts/test.pl > /dev/null 2>&1

我知道在创建sql文件时正在执行脚本。但是,在10.08am之后,没有新行插入到数据库中。我搜索了解决方案,有些人建议使用DBI模块,但服务器上没有。

编辑:最终没有设法解决它。 root / admin帐户用于执行脚本,以便&#34;解决&#34;问题。

3 个答案:

答案 0 :(得分:2)

首先,摆脱> /dev/null 2>&1条目末尾的crontab(至少是暂时的),这样您就可以看到可能发生的任何错误

换句话说,暂时将其更改为:

08 10 * * * perl /opt/lampp/htdocs/otpms/Data_Tsunami/scripts/test.pl >/tmp/myfile 2>&1

然后,您可以检查/tmp/myfile文件以查看正在输出的内容。

可能的情况是mysql实际上并不在cron作业的路径上,因为cron本身提供了相当小的环境。< / p>

要解决该问题(假设它是什么),请参阅this answer,其中提供了有关如何最好地扩展cron环境以提供所需内容的一些指导。这可能只涉及将MySQL可执行文件目录添加到PATH变量。

您可能要考虑的另一件事是关闭out_fh文件,然后再尝试将其传递给mysql - 如果缓冲区尚未刷新,则它可能仍然是一个空文件正如其他过程一样。

答案 1 :(得分:0)

  

表达式glob(&#34;。* *&#34;)匹配当前工作中的所有文件   目录。    - http://perldoc.perl.org/functions/glob.html

你不应该依赖于cron工作中的wd。如果要使用具有相对路径的glob(或任何文件操作),请首先使用chdir设置wd。 来源:http://www.perlmonks.org/bare/?node_id=395387

因此,如果您的工作目录是/home/user,则应插入

chdir('/home/user/');

WHILE之前,即:

sub insert()
{
    my $SQL_COMMAND = "mysql -u $USERNAME -p'$PASSWORD' ";

    chdir('/home/user/');

    while( my $sql_file = glob '*.sql' )
    {
...

/home/user替换为创建sql文件的位置。

答案 2 :(得分:0)

最好在Perl中尽可能多地进行处理。它避免了生成单独的shell进程的开销,并使一切都在程序的控制之下,以便您可以更简单地处理任何错误

Perl的数据库访问是使用DBI module完成的。该程序演示了如何使用mysql实用程序实现您所编写的内容。正如你所看到的那样,它也更加简洁

#!/usr/bin/perl

use strict;
use warnings;

use DBI;

my $host     = "i";
my $username = "need";
my $password = "help";

my $dbh = DBI->connect("DBI:mysql:database=test;host=$host", $username, $password);

my $insert = $dbh->prepare('INSERT INTO BOL_LOCK.test(name) VALUES (?)');

my $rv = $insert->execute('wow');

print $rv ? "pass\n" : "fail\n";