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