Obtém o valor de deslocamento ntpdate em uma variável em python

2

Gostaria de verificar se o tempo de deslocamento é maior que 0,5 segundos e fazer alguma ação. Estou executando o comando ntpdate -q <Server ip address>

Alguém pode me dizer como devo capturar o valor de deslocamento em uma variável para que eu possa realizar uma ação adicional?

    
por Iram Khan 16.08.2016 / 14:22

2 respostas

1

Solução

import subprocess

output = subprocess.check_output('ntpdate -q 3.us.pool.ntp.org | head -1 | cut -d " " -f 6 | sed "s/.$//"', shell=True)

Você pode alterar o nome do servidor "3.us.pool.ntp.org" para o servidor NTP de sua escolha.

Com este método, a variável de saída irá conter somente o deslocamento indicado na primeira linha da saída do comando ntpdate e você poderá fazer o que quiser com essa figura depois.

if output > X:
    do something...

Explicação

Você já sabe o que o ntpdate faz (claramente), então você saberá que a saída que ele traz possui muitas informações inúteis para o que você está tentando fazer.

  • O subprocesso permite que você execute comandos bash de dentro do seu script python

  • check_output faz exatamente o que diz na lata e, neste caso, armazena na variável de saída.

  • head -1 simplesmente pega a primeira linha da saída ntpdate se estiver usando um pool como eu fiz no meu exemplo (os vários resultados não devem variar muito, então o topo deve Fique bem).

  • cut trata as linhas como campos delimitados por um caractere de espaço. Ele classifica e seleciona o sexto campo que é o valor de deslocamento.

  • sed remove o último caractere desse valor, que é uma vírgula e arruinará qualquer tentativa que você fizer para realmente usar o valor.

  • shell = True invoca um shell para executar a ação.

~~~~~~~~~ EDITAR ~~~~~~~~~~~

Eu também não tenho o representante para comentar, ha. Você poderia por favor me avisar qual versão do python o servidor está executando @Iram Khan?

python -V

Eu suspeito que seja uma versão < 2.7 como era quando a funcionalidade check_output foi adicionada. Nesse caso, você pode ter que alterar o acima para:

import subprocess

cmd = "ntpdate -q 3.us.pool.ntp.org | head -1 | cut -d ' ' -f 6 | sed 's/.$//'"

ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)

output = ps.communicate()[0]

Isso deve ser feito se check_output não funcionar.

    
por 16.08.2016 / 15:27
1

Use backtics '' para avaliação de comandos e atribua saída à variável

OFFSET='ntpdate -q <Server ip address>  |sed 's/.*\(offset\) \([0-9]\.[0-9]\+\).*//''
if [[ $OFFSET -gt 0.5 ]]; then
   <do something...>
fi
    
por 16.08.2016 / 15:20