我正在解析日志文件,并且我需要每1秒,5分钟,5分钟,15分钟,30小时,1小时生成包含结果的JSON文件..等等
我对这里的概念感到困惑,有可能编写一个大的无限while循环,其中包含多个子程序,每个子程序将根据不同的时间间隔执行解析。
到目前为止,我还没有确定这是否是正确的方法
#!/usr/bin/perl
use strict;
use warnings;
$ | = 1; # Ensure output appears
my $interval = 1;
my @command = "echo processing ...";
my $count = 0;
while (1) {
`since access.log | json_convert.pl
sleep $interval - time % $interval;
system @command;
}
答案 0 :(得分:1)
重复的CREATE PROCEDURE sp_generate_insertscripts
(
@TABLENAME VARCHAR(MAX),
@FILTER_CONDITION VARCHAR(MAX)='' -- where TableId = 5 or some value
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @TABLE_NAME VARCHAR(MAX),
@CSV_COLUMN VARCHAR(MAX),
@QUOTED_DATA VARCHAR(MAX),
@TEXT VARCHAR(MAX),
@FILTER VARCHAR(MAX)
SET @TABLE_NAME=@TABLENAME
SELECT @FILTER=@FILTER_CONDITION
SELECT @CSV_COLUMN=STUFF
(
(
SELECT ',['+ NAME +']' FROM sys.all_columns
WHERE OBJECT_ID=OBJECT_ID(@TABLE_NAME) AND
is_identity!=1 FOR XML PATH('')
),1,1,''
)
SELECT @QUOTED_DATA=STUFF
(
(
SELECT ' ISNULL(QUOTENAME('+NAME+','+QUOTENAME('''','''''')+'),'+'''NULL'''+')+'','''+'+' FROM sys.all_columns
WHERE OBJECT_ID=OBJECT_ID(@TABLE_NAME) AND
is_identity!=1 FOR XML PATH('')
),1,1,''
)
SELECT @TEXT='SELECT ''INSERT INTO '+@TABLE_NAME+'('+@CSV_COLUMN+')VALUES('''+'+'+SUBSTRING(@QUOTED_DATA,1,LEN(@QUOTED_DATA)-5)+'+'+''')'''+' Insert_Scripts FROM '+@TABLE_NAME + @FILTER
--SELECT @CSV_COLUMN AS CSV_COLUMN,@QUOTED_DATA AS QUOTED_DATA,@TEXT TEXT
EXECUTE (@TEXT)
SET NOCOUNT OFF
END
调用会迅速发生变化,因为它们没有考虑创建JSON数据所花费的时间。我也非常谨慎地使用sleep
调用来进行数据操作,因为它必然会减慢速度,并且你可能会超出你正在寻找的一秒响应时间。在Perl中完成所有工作
我建议您查看优秀的EV
模块。 周期性事件类型是您需要的
这是一个非常简短的例子。你自己的回调子程序应该检查它被调用的时间,以确定要做什么,根据它是5秒,60秒等的倍数。或者你可以设置多个事件循环,每个间隔一个。该模块非常简单
system
use strict;
use warnings 'all';
use feature 'say';
use EV;
use Time::Piece 'localtime';
STDOUT->autoflush;
my $one_second = EV::periodic 1, 1, 0, \&callback;
sub callback {
say "Periodic event at ", localtime(EV::now)->hms;
};
EV::run;
等