下記は 接続の要求があったら、その要求を要求リストに加える。 空の要求リストに新たに要求が追加された場合は ppp -batch を 行なう。 切断の要求があったら、要求リストから接続要求を削除する。 要求リストが空になったら、 ppp -batch のプロセスを kill する。 という制御を行なうスクリプトの例です。 #!/usr/local/bin/perl ($op,$id)=@ARGV; $usage="Usage: ppp-request add|delete id\n"; $LOCK_SH = 1; $LOCK_EX = 2; $LOCK_NB = 4; $LOCK_UN = 8; $object="foo"; $ppp_cmd="/usr/sbin/ppp -background $object"; $ppp_kill_cmd='kill `ps -ax |grep /usr/sbin/ppp|grep -v grep|awk \'{print $1}\'`'; $reqlist="/var/spool/ppp/ppp-request.list"; $lock="/var/spool/ppp/ppp-request.lock"; if($op eq "add") { &add($id); } elsif($op eq "delete") { &delete($id); } else { die $usage; } sub add { my($id)=@_; &lock(); @list=(); if(-f $reqlist) { open(LIST,$reqlist) || die "$reqlist cannot be opened\n"; while() { chop; push(@list,$_); } close(LIST); } if($#list<0) { system($ppp_cmd); } push(@list,$id); open(LIST,">$reqlist") || die ">$reqlist cannot be opened\n"; foreach $i (@list) { print LIST "$i\n"; } close(LIST); &unlock(); } sub delete { my($id)=@_; &lock(); @list=(); if(-f $reqlist) { open(LIST,$reqlist) || die "$reqlist cannot be opened\n"; while() { chop; if($_ ne $id) { push(@list,$_); } } close(LIST); } open(LIST,">$reqlist") || die ">$reqlist cannot be opened\n"; foreach $i (@list) { print LIST "$i\n"; } close(LIST); if($#list<0) { system($ppp_kill_cmd); } &unlock(); } sub lock { open(LOCK,">$lock") || die "$lock cannot be opened\n"; flock(LOCK,$LOCK_EX); } sub unlock { flock(LOCK,$LOCK_UN); close(LOCK); }