|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
在linux中学习命令的最好办法是学习Shell脚本编程,Shell脚本比起其他语言来学习简单,但是功能却十分强大.通过学习Shell编程,能让你掌握大量的linux命令。
Perl历程间通信头几天做了一个对照复杂的器材,但感到对照意义就在这里记上去。也许的需求是如许的:有一个程序在会发生一些告诫信息并保留在/var/log/alert中的。假如有新的告诫信息时就要在服务器上收回告诫的声响,但启动是经由过程web界面的而不是在命令行。
刚入手下手想到步骤是如许的:
1、由于是要在背景运转,一定是fork一个子历程,父历程加入而不会使web程序堵塞在此,
2、然后再fork一个子历程,父历程卖力监听日记文件的更新。子历程卖力挪用声响程序。二者之者用管道通信。
3、要及时监控日记文件的更新,由于不想弄太庞大就用管道的体例:open(LOG,"tail-n2-f/var/log/alert|")||die"Unabletoopenlogfile$!
";如许就能够复杂的失掉文件的及时更新
4、要思索到加入,以是必要一个文件保留历程ID。
如许完成的代码很复杂:
my$pidfile="/tmp/alertsounds.pid";
subStartAlertSounds{
my$pid;
if($pid=fork()){
return;
}elsif(defined$pid){
system("echopid=$>$pidfile");#保留历程ID
&RunAlertSounds();
}
}else{
die"Cantfork:$!
";
}
}
subRunAlertSounds{
my$pid;
pipe(README,WRITEME);
if($pid=fork()){#父历程
close(README);
open(LOG,"tail-n2-f/var/log/alert|")||die"Unabletoopenlogfile$!
";
while(<LOG>){
printWRITEME"Sounds
";
}
close(LOG);
close(WRITEME);
}elsif(defined$pid){#子历程
close(WRITEME);
while(<README>){
system("/usr/bin/sounds/AlertSounds>/dev/null2>&1");
}
close(README);
}else{
die"Cantfork:$!
";
}
}
但测试一下就发明了很多成绩:
1、加入时open(LOG,"tail-n2-f/var/log/snort/alert|")所发生的子历程不会一同加入。
2、当短工夫内(好比1秒)有多条信息过去时,我们但愿只发生一条告诫声响,但如今会一连响多条。
3、偶然父历程往管道写数据时子历程纷歧定能即刻收到;
剖析一下就有上面的办理办法:
1、使父历程成为历程组的首级头目历程,然后在父历程加入前给历程组发送加入旌旗灯号。
2、利用锁机制,父历程写数据前锁定。等子历程挪用声响程序完成后再解锁。在解锁前假如父历程有监听到新的告诫就疏忽。复杂的一点的锁机制就用一个文件:父历程创立一个空文件暗示已上锁,子历程删除这个文件暗示解锁
3、这个是由于缓存成绩,把管道的缓存设置好就好了。
修正后的代码以下:
my$pidfile="/tmp/alertsounds.pid";
my$lockfilename="/tmp/sounds.lock";
subStartAlertSounds{
my$pid;
if($pid=fork()){
return;
}elsif(defined$pid){
setpgrp(0,0);#以后历程成为历程组的首级头目
$SIG{INT}=&catch_zap;#INT旌旗灯号处置
$SIG{QUIT}=&catch_zap;#QUIT旌旗灯号处置
system("echo$>$pidfile");#保留历程ID
&RunAlertSounds();
}
}else{
die"Cantfork:$!
";
}
}
subRunAlertSounds{
my$pid;
system("rm-f$lockfilename");
pipe(README,WRITEME);
if($pid=fork()){#父历程
close(README);#封闭读端
select(WRITEME);#这里必定要选择,否则设置的缓存巨细不会对WRITEME无效
$|=1;
open(LOG,"tail-n2-f/var/log/alert|")||die"Unabletoopenlogfile$!
";
while(<LOG>){
system(“touch$lockfilename");#加锁
printWRITEME"Sounds
12下一页
学习linux,就意味着更快的开发效率,等更多关于软件本身或者说操作系统本身的理解。 |
|