Problema com $ RANDOM no crontab

7

Eu tenho um problema estranho com o $ RANDOM no cron. Desejo executar um comando em um número aleatório de minutos após o acionamento do cronjob.

Este exemplo funciona diretamente no terminal e atrasa o comando em até 30 segundos (substitua o comando com o que você quiser, na verdade é um eco para / dev / ttyUSB0):

sleep 'expr $RANDOM \% 30' ; command

Se a mesma linha é colocada no crontab, o comando sempre dispara imediatamente sem o atraso:

* * * * * sleep 'expr $RANDOM \% 30' ; command

Se eu usar uma expressão sem $ RANDOM, isso funcionará bem - isso gera um atraso de 15 segundos:

* * * * * sleep 'expr 10 + 5' ; command

Em outras palavras, parece que $ RANDOM não funciona em um cron.

Mas não é simplesmente porque o próprio $ RANDOM é avaliado como zero, porque então isso deve dar um atraso de 10:

* * * * * sleep 'expr $RANDOM \% 30 + 10' ; command

Eu também tentei com & & instruir de; mas isso não ajuda. Na verdade, o comando não dispara de jeito nenhum!

Eu poderia colocar o atraso em um script que é então chamado de crontab, mas isso não explica o meu problema e não me faz aprender: -)

É o Debian Lenny se isso faz alguma diferença.

    
por marlar 30.03.2011 / 20:13

2 respostas

14

cron usa o shell /bin/sh para executar tarefas. Em algumas distros, este é um link simbólico para dash . Nenhum deles suporta a variável $RANDOM , que é uma extensão bash -específica.

  • Com vixie-cron, você pode colocar uma linha SHELL=/bin/bash no topo do seu crontab.

  • Caso contrário, você terá que resolver com bash -c 'echo $RANDOM' ou perl -e 'print int(rand(65535))' .

    (No exemplo acima, 65535 é o número máximo a ser retornado. Você também pode aplicar outras contas no script.)

  • Em um sistema configurado adequadamente, você teria sido informado sobre isso por cron - sempre envia a saída da tarefa, incluindo mensagens de erro, por email. Instale um MTA leve.

Além disso, no bash, $(( )) é preferido em relação a 'expr' .

    
por 30.03.2011 / 20:35
1

cron normalmente é executado com um ambiente menos "completo", o que significa que você simplesmente não possui muitas das mesmas variáveis de ambiente disponíveis para você. Aparentemente $RANDOM é um desses, e na verdade seu comando sleep está simplesmente falhando com um erro por causa da variável indefinida - é por isso que seu comando falhou ao ser executado quando você mudou para && em vez de ; . (Bem, na verdade, $RANDOM é uma função Bash, mas cron não é executado em um ambiente Bash completo, que evidentemente não tem essa função.)

Para realizar essa tarefa, você precisará usar um script Bash separado, como você disse. Como alternativa, você pode descobrir uma maneira de usar cat /dev/urandom diretamente no comando cron , mas provavelmente seria mais fácil mover o que você tem atualmente para um script Bash separado.

    
por 30.03.2011 / 20:33

Tags