Perl

Perl


ワンライナー


エンコード

  • echo "@" | perl -ne 's/([^\w ])/"%".unpack("H2",$1)/eg;s/ /\+/g;print;print "\n";'

デコード


# perlでデーモン作成
 #!/usr/local/bin/perl
 use strict;
 use warnings;
 my $PID;
 my $PID_FILE = "/home/fattencho/daemon.pid";
 my $SLEEP_INTERVAL = 10;
 main(@ARGV);
 exit(0);
 sub main {
     my ($act) = @_;
     $act ||="";

     if ($act eq "start"){       #daemonの起動
         #複数の起動はできません
         if( get_pid_file() ){
             print "$0 is already running\n";
             return;
         }
         init();
         action();
         return;
     }

     if ($act eq "stop"){        #daemonの停止
         my $pid = get_pid_file();
         if(not defined $pid){
             print "$0 is not running\n";
             return;
         }
         #pid fileを削除すると、後でkillされます
         return del_pid_file();
     }

     print "usage: $0 [start|stop]\n";
     return;
 }
 sub init {
     my $pid = fork;

     # Fork failure.
     if($pid < 0){
         exit -1;
     }
     # Fork success.
     elsif($pid){
         exit 0;
     }

     #signal送信時に実行するmethod
     $SIG{INT} = $SIG{HUP} = $SIG{QUIT} = $SIG{KILL} = $SIG{TERM} ='interrupt';

     $PID = $$;
     set_pid_file($PID);
 }
 sub action {
     while(1) {
         sleep($SLEEP_INTERVAL);

         #pidファイルが削除されていれば、自分自身をkillします
         if (not get_pid_file() ){
             kill $PID;
             return;
         }
     }
 }

 sub interrupt {
     my ($sig) = @_;
     $SIG{$sig} = 'IGNORE';
     return del_pid_file();
 }

 sub get_pid_file {      #pid fileの名称とpidの取得
     return undef if not -e $PID_FILE;

     open my $fh, $PID_FILE or die "can't open $PID_FILE :$!";
     my ($line) = <$fh>;
     close $fh or die "can't close $PID_FILE :$!";

     my ($pid) = $line =~ /(\d+)/o;
     return ($PID_FILE,$pid);
 }

 sub get_pid_file {      #pid fileの名称とpidの取得
     return undef if not -e $PID_FILE;

     open my $fh, $PID_FILE or die "can't open $PID_FILE :$!";
     my ($line) = <$fh>;
     close $fh or die "can't close $PID_FILE :$!";

     my ($pid) = $line =~ /(\d+)/o;
     return ($PID_FILE,$pid);
 }

 sub set_pid_file {      #pid fileにpidを書き込み
     my ($process_id) = @_;
     open my $fh, ">$PID_FILE" or die "can't open $PID_FILE :$!";
     print $fh $process_id;
     close $fh or die "can't close $PID_FILE :$!";
 }
 sub del_pid_file {
     unlink $PID_FILE or die "can't unlink $PID_FILE :$!";
 }

 1;
最終更新:2011年11月08日 01:49