solo �Ȥ���̾���� perl script ��App::solo �Ȥ���̾�ǥ�꡼�����ޤ�����

�ץ������֤δ����դ���¾���å� - (��)���
  • �ץ������֤���¾Ū�¹Ԥ����椷����
  • ������ַвᤷ����¹ԤǤ���褦�ˤ�����

������Ф����̲����Ǥ���

�ʲ���POD�ξ�����

NAME
    solo - run only one process up to given timeout.
SYNOPSIS
    solo -t seconds [-P pidfile] [-K signal] cmd ...

DESCRIPTION
    cmd�ʹߤǻ��ꤵ�줿���ޥ�ɤ򡢰��������¾Ū�˼¹Ԥ��ޤ���
    ������֤�᤮���饳�ޥ�ɤ�SIGTERM������ޤ���

    cmd�����Ǥ˼¹���ξ�硢�¹���Υ��ޥ�ɤ�PID�����ä�
    ���顼��å���������Ϥ��줿�塢cmd��¹Ԥ��뤳�Ȥʤ���λ���ޤ���
    
    ����Υ��å���󤬰۾ェλ���Ƥ������ˤϡ�����Υ��å����ν�λ���
    �򥨥顼��å������Ȥ��ƽ��Ϥ�����cmd��¹Ԥ��뤳�Ȥʤ���λ���ޤ���
������ϥ����ॢ���Ȥξ���ޤߤޤ���

    -f
      ����Υ��å���󤬰۾ェλ���Ƥ������ˤ⶯��Ū�˥��ޥ�ɤ�¹Ԥ��ޤ���
      ���ξ��ˤ⥻�å���󤬿ʹ���ξ��ˤ�solo�ϼ¹Ԥ���ݤ�������α�դ���
      ����������

    -t seconds
      ���֤��äǻ��ꤷ�ޤ�����ά���줿��硢86400(=1��)�����ꤵ��ޤ���
      Time::HiRes�Τ������Ǿ������ʲ��λ�����ǽ�Ǥ���

    -P pidfile
      PID�ե�����ΰ��֤���ꤷ�ޤ����ǥե���ȤǤ� root���¤Ǽ¹Ԥ��줿����
      "/var/run/cmd.pid" �򡢤���ʳ��Ǥ�"/var/tmp/cmd.pid"���Ѥ��ޤ�

    -K signal
      �ǥե���Ȥ�SIGTERM�ʳ��Υ����ʥ����ꤷ�ޤ���
�¹���
% cat sleep.pl
#!/usr/bin/env perl
use strict;
use warnings;
my $seconds = shift || 1;
while ($seconds > 0) {
    print $seconds--, "\n";
    sleep 1;
}    
% ./sleep.pl 3
3
2
1
% solo -t 2 ./sleep.pl 3
3
2
./sleep.pl: Operation timed out
% solo -t 2 ./sleep.pl 3
./sleep.pl: Last session ended abnormally: Operation timed out (60).
% solo -f -t 4 ./sleep.pl 3
3
2
1
% solo ./sleep.pl 3
3
2
1

���󥹥ȡ���

cpanminus��git���б������������ǡ��ʲ��Τ褦�ˤ��ư�ȯ�ǥ��󥹥ȡ���Ǥ��ޤ���

% cpanm git://github.com/dankogai/p5-app-solo.git

miyagawa++;

�����奢�뤫��Unix��¸����䶯�����ޥ�ɤʤΤǡ�CPAN�ˤϾ夲�ʤ��Ǥ����ޤ���

�����Ȥ�����ͳ

�㤨�С��ե����륪���С���¹Ԥ��륹����ץȤϡ����٤�¹ԤǤ���ȥե����륪���С�/�Хå��򷫤��֤��ƥե�åפ���Τǡ����٥ե����륪���С������������֤ϼ¹ԤǤ��ʤ��褦�ˤ�����

�Ȥ������ȤǤ���С����������Ϥ��Υ��ޥ�ɤϤ��⤽��ʣ���¹ԤǤ��ʤ��褦�ˤ��������褤�Ǥ������դ˰�����֤�Ф��˽�λ�����ΤǤ����¨�¤˺Ƽ¹ԤǤ���褦�ˤʤäƤ���Фʤ�˾�ޤ����櫓�Ǥ���

solo�Ǥϡ�����򤳤Τ褦�ˤ��Ƽ¹Ԥ��Ƥ��ޤ���

  • PID�ե����������å���¸�ߤ��Ƥ���Х��顼��å�������ɽ�����ƽ�λ��
  • fork�����塢���ޥ�ɤ�ҥץ�������exec����PID�ե���������
  • �ƥץ������ϡ���ʬ���Ȥ�alarm�ò¤«¤ï¿½ï¿½ï¿½ï¿½å¡¢ï¿½Ò¥×¥ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½wait��
    • ��ʬ���Ȥ�alarm�������ä��顢¨�¤˻ҥץ�������kill
  • PID�ե�����������ƽ�λ��

�ʲ������Υ������ʬ�ˤʤ�ޤ���

eval {
    local $SIG{ALRM} = sub { die ETIMEDOUT, "\n" };
    alarm $timeout;
    $cpid = fork();
    die $! unless defined $cpid;
    if ($cpid) {
        print {$pidfh} $cpid, "\n";
        close $pidfh;
        wait;
    }
    else {
        exec $cmd, @ARGV;
    }
    alarm 0;
};
cleanup(($? || $@);

�¤Ϥ��졢lleval�Ǥ�ȤäƤ���ƥ��˥å��ǡ�Perl Cookbook����16�Ϥˤ�ܤäƤ��ޤ���IPC����ߤξ�����񤷤���˥ͥåȤǤ�빽õ���ˤ����Τǡ������긵�ˤ����Ƥ����Ƚ������ޤ����Ѹ��Kindle�ǤǤ�2,000�ߤ��ڤäƤޤ�����

Enjoy!

Dan the Man with Too Many Processes to Kill