簡體   English   中英

Cronjob在Perl腳本中不執行命令行

[英]Cronjob does not execute command line in perl script

我不熟悉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來運行此文件時,可以使用以下行(在crontab -e )說:10.08am:

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

我知道腳本是在創建sql文件時執行的。 但是,上午10.08之后不會將新行插入數據庫。 我已經搜索了解決方案,並且有人建議使用DBI模塊,但是該模塊在服務器上不可用。

編輯:最后沒有設法解決它。 使用root / admin帳戶執行腳本,以便“解決”問題。

首先,請在crontab條目的末尾(至少暫時)擺脫> /dev/null 2>&1 ,以便實際上可以看到任何可能發生的錯誤。

換句話說,暫時將其更改為:

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

然后,您可以檢查/tmp/myfile文件以查看正在輸出的內容。

可能的情況是mysql實際上不在您的cron作業中,因為cron本身提供了一個相當小的環境。

要解決該問題(假設就是問題所在),請參閱此答案該答案提供了有關如何最佳地擴展cron環境以提供所需內容的一些指導。 那可能只涉及將MySQL可執行文件目錄添加到PATH變量中。

您可能要考慮的另一件事是,在嘗試將out_fh文件傳遞給mysql之前, out_fh其關閉-如果尚未刷新緩沖區,就其他進程而言,它仍然可能是一個空文件。

表達式glob(“。* *”)匹配當前工作目錄中的所有文件。 -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文件的位置。

最好在Perl中進行盡可能多的處理。 它避免了生成單獨的shell進程的開銷,並將所有內容都留在了程序的控制之下,因此您可以更輕松地處理任何錯誤

使用DBI模塊可以從Perl訪問數據庫。 該程序演示了如何使用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";

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM