[英]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.