dando início a um comando sem esperar pela primeira execução

1

Eu quero uma maneira melhor de fazer isso, principalmente para uso de linha de comando:

while sleep 60; do 
  mysql -e 'show processlist'; 
done

Isso é melhor que:

while mysql -e 'show processlist'; do
  sleep 60;
done

... porque se eu digitar um ctrl-c , ele parará. No entanto, a primeira versão aguarda um minuto antes da primeira saída.

Eu sei sobre watch . Frequentemente bom, mas não para todas as circunstâncias. Eu estou procurando uma saída simples para stdout, não maldições. Seria bom se watch tivesse uma opção --stdout .

Simplicidade é a chave aqui. Eu não me importo em lidar com erros na instrução mysql. Pode relatar seus próprios erros para stdout.

    
por mc0e 22.12.2014 / 12:44

3 respostas

1

Ctrl + C mata todo o loop em circunstâncias normais. O sinal é enviado para todo o grupo de processos em primeiro plano.

Você pode estar procurando

while mysql -e 'show processlist' && sleep 60; do :; done

que sai assim que mysql ou sleep falhar.

    
por 23.12.2014 / 00:37
1

Este pode funcionar para você:

trap "pkill -TERM -P $$" SIGINT

while [ 1 ]; do
   mysql -e 'show processlist'
   sleep 60
done
    
por 22.12.2014 / 13:47
0

Bem, pelo seu exemplo ...

n=; while sleep "$((n&(n=60)))"
do   mysql...
done

... vai fazer isso. Na primeira vez vai sleep 0 e todo o restante sleep 60 . Ainda assim, acho que provavelmente há uma maneira melhor de atingir seu objetivo final do que isso.

Se você usou algo assim, provavelmente deseja fazer isso em uma função:

every_minute() ( n=
    while sleep "$((n&(n=60)))"
    do "$@"; done)

... ou em uma única linha ...

every_minute() (n=; while sleep "$((n&(n=60)))"; do "$@"; done)

Se você colocar algo parecido no arquivo rc do seu shell, você pode fazer ...

every_minute mysql "$whatever" "$args" "$you" "$use"

... ou você pode simplesmente digitar a versão de linha única em qualquer prompt e continuar a usá-la até fechar o shell.

    
por 22.12.2014 / 13:45

Tags