То, что Вы хотите, является неинтерактивной очередью команды. Хорошие новости! Я записал один для Вас.
enqueue_cmd
:
#!/usr/bin/perl -w
# Enqueue a job
use strict;
use Fcntl qw(:flock);
my $JOB_QUEUE_FILE = '/var/tmp/job_queue';
my $LOCK_TRIES = 5;
my $LOCK_SLEEP = 1;
my $jq;
open $jq, ">> $JOB_QUEUE_FILE" or die "!open $JOB_QUEUE_FILE: $!";
my $locked = 0;
LOCK_ATTEMPT: for (my $lock_tries = 0; $lock_tries < $LOCK_TRIES;
$lock_tries++)
{
if (flock $jq, LOCK_EX) {
$locked = 1;
last LOCK_ATTEMPT;
}
sleep $LOCK_SLEEP;
}
$locked or die "could not lock $JOB_QUEUE_FILE";
for (@ARGV) {
print $jq "$_\n";
}
close $jq;
dequeue_cmd
:
#!/usr/bin/perl -w
# Dequeue a jobs and run them
use strict;
use Fcntl qw(:seek :flock);
use FileHandle;
my $QUEUE_FILE = '/var/tmp/job_queue';
my $OUTPUT_FILE = '/var/tmp/job_out';
my $LOCK_TRIES = 5;
my $LOCK_SLEEP = 1;
my $JOB_SLEEP = 1;
my $locked;
my $jo;
open $jo, ">> $OUTPUT_FILE" or die "!open $OUTPUT_FILE: $!";
$jo->autoflush(1);
my $jq;
open $jq, "+< $QUEUE_FILE" or die "!open $QUEUE_FILE: $!";
my @jobs = ( );
my $job;
JOB: while (1) {
if (-s $QUEUE_FILE == 0) {
sleep $JOB_SLEEP;
next JOB;
}
$locked = 0
LOCK_ATTEMPT: for (my $lock_tries = 0; $lock_tries < $LOCK_TRIES;
$lock_tries++)
{
if (flock $jq, LOCK_EX) {
$locked = 1;
last LOCK_ATTEMPT;
}
sleep $LOCK_SLEEP;
}
$locked or die "could not lock $QUEUE_FILE";
seek $jq, 0, SEEK_SET or die "could not seek to start of file";
push @jobs, <$jq>;
truncate $jq, 0 or die "could not truncate $QUEUE_FILE";
seek $jq, 0, SEEK_SET or die "could not seek to start of $QUEUE_FILE";
flock $jq, LOCK_UN;
for $job (@jobs) {
chomp $job;
print $jo "## executing $job\n";
print $jo `$job`;
}
sleep $JOB_SLEEP;
}
Во-первых, выполненный nohup ./dequeue_cmd &
, Затем добавьте свои команды как так:
./enqueue_cmd "echo 'hello world'" "sleep 5" "date"
./enqueue_cmd "ls /var/tmp"
Вывод появляется в /var/tmp/job_out
:
tail -F /var/tmp/job_out
## executing echo 'hello world'
hello world
## executing sleep 5
## executing date
Fri Dec 10 16:35:43 PST 2010
## executing ls /var/tmp
ff
job_out
job_queue
ss
Соответствующая ошибка заключается в следующем:
auth_ldap authenticate: user pyae authentication failed; URI /svn/Software [LDAP: ldap_simple_bind_s() failed][Server Down]
Либо он не может связаться с сервером LDAP, либо учетные данные, предоставленные для BindDN, больше не действительны.