Utilitário / programa leve para executar um comando após um atraso aleatório

7

Eu preciso randomizar o tempo antes que um determinado comando seja iniciado. Eu percebo que é relativamente trivial fazer isso dentro de um script, ou escrever um script "wrapper" para fazer isso, mas eu estou querendo saber se alguém sabe um programa binário leve que já está lá fora, que vai conseguir isso sem exigir um intérprete carregado.

EDIT: Mais especificamente, eu não quero envolver bash de alguma forma. Suponha, por uma questão de argumento, que nenhum shell está disponível e estou invocando isso de um programa não interativo.

    
por LawrenceC 08.06.2011 / 22:22

3 respostas

4

Se você quiser um controle mais refinado do que os agradáveis encantamentos do maxschlepzig , é uma coisa razoavelmente fácil de codificar:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

int main(int argc, char**argv){
  useconds_t mdelay=0, delay;
  if (argc<3){
    fprintf(stderr,"%s <delay (in milli-seconds)> <command> <args>* :\n\trun commands with a random delay\n",argv[0]);
    exit(1);
  }
  mdelay=atol(argv[1]);
  /* seed random number generator with the time */
  srand(((unsigned int)time(NULL))%RAND_MAX); 
  delay = mdelay * (rand() / (1.0 + RAND_MAX));
  usleep(delay*1000);
  execvP(argv[2],getenv("PATH"),argv+2);

  return 0;
}

Compile com algo como gcc randomdelay.c -o randomdelay e chame como

$ randomdelay 10000 echo Hi!

Se você estiver fazendo isso é um contexto de programação, talvez seja melhor pegar a parte do código que escolhe o atraso aleatório para você e chama uma função exec family (qual deles você quer depende exatamente de como você especificado internamente).

Emitir aqui:

  • Isso pressupõe que seus sistemas rand / srand sejam sãos (não é bom que os PRNGs se importem com o fato de que eles fazem o que a página man diz que eles fazem). Eu tenho tido alguns problemas com isso na minha caixa do Mac OS X, onde essas funções estão obsoletas em favor de random / srandom .
  • Historicamente, muitas implementações de rand tiveram características numéricas ruins. Isso não deve ser um problema neste aplicativo, mas se for, substitua-o por um PRNG melhor.
  • O argumento de linha de comando usado neste brinquedo é um pouco primitivo.
  • O atraso é escolhido uniformemente de algum intervalo. Para algumas aplicações, você pode preferir uma distribuição ilimitada como um exponencial. O Stack Overflow tem muitas perguntas sobre como obter distribuições não uniformes de um PRNG uniforme.
por 09.06.2011 / 04:08
6

Em bash você pode fazer assim:

sleep $(($RANDOM%3)) && some_command

aguardando assim entre 0 e 2 segundos antes de executar o comando. Ou escolha outro intervalo.

Ou se $RANDOM não estiver disponível, você pode tentar jot :

sleep 'jot -r 1 0 3' && some_command

Claro, a espera aleatória mais a execução não é fornecida por um único binário, mas sim por perto. Bem, ter um único binário seria menos ortogonal, seria contra o princípio de uma ferramenta por um trabalho (e o princípio keep-it-simple (KISS)).

    
por 08.06.2011 / 23:23
1

O mais simples é o comando sleep . Para executar seu programa dez segundos a partir de nowdo algo como isto:

sleep 10 && your_command

Em seguida, se você precisar de um pouco mais de sofisticação, será o at programador. Você pode agendar uma tarefa para ser executada em uma hora assim:

echo "your_command" | at +1 hour
    
por 08.06.2011 / 22:32