我对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;问题。答案 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";