複数のディレクトリにシンボリックリンクされているプログラムがあります。
/main/foo.pl
/run1/foo.pl -> /main/foo.pl
/run2/foo.pl -> /main/foo.pl
/run3/foo.pl -> /main/foo.pl
/run4 /foo.pl -> /main/foo.pl
それらは cron ジョブとして実行されているため、crontab に次のエントリがあります。
*/2 * * * * /run1/foo.pl
*/2 * * * * /run2/foo.pl
*/2 * * * * /run3/foo.pl
*/2 * * * * /run4/foo .pl
foo.plのスニペットは次のとおりです。
use Fcntl qw(:flock);
use autodie qw(:all);
open my $self, '>', "$FindBin::Bin/lockme";
flock( $self, LOCK_EX|LOCK_NB )
or die "Cannot acquire lock, already running!";
{
my $long_proc = Process->new();
$long_proc->run();
}
ロック セマフォ チェックがあるため、各 cron プロセスは 1 回しか実行できないことがわかります。ただし、run1、run2、run3、および run4 は同時に実行できます。
ここで必要なのは、プロセスの数を最大 4 つに制限することです。誰かが次のような別の cron プロセスを追加した場合:
新しいシンボリックリンク:
/run5/foo.pl -> /main/foo.pl
/run6/foo.pl -> /main/foo.pl
追加の crontab:
*/5 * * * * /run5/foo.pl
* * * * * /run6/foo.pl
run1、run2、run3、および run4 がすべて実行中の場合は、常に run5 と run6 の両方をキューに入れる必要があります。したがって、常に 4 つのプロセスのみが実行されます。
どうすればそれを達成できますか?それを処理する CPAN モジュールはありますか?
ありがとう!