web-dev-qa-db-ja.com

python)の変数でntpdateオフセット値を取得します

オフセットのタイミングが0.5秒を超えているかどうかを確認し、何らかのアクションを実行したいと思います。コマンドを実行していますntpdate -q <Server ip address>

さらにアクションを実行できるように、変数にオフセット値をキャプチャする方法を誰かに教えてもらえますか?

3
Iram Khan

解決策

import subprocess

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

「3.us.pool.ntp.org」サーバー名を任意のNTPサーバー)に変更できます。

この方法では、出力変数にはntpdateコマンド出力の最初の行に記載されているオフセットonlyが含まれ、その図でやりたいことができます。後。

if output > X:
    do something...

説明

Ntpdateが(明らかに)何をするかをすでに知っているので、それが返す出力には、あなたがやろうとしていることについて多くの役に立たない情報が含まれていることがわかります。

  • サブプロセスを使用すると、pythonスクリプト内からbashコマンドを実行できます

  • check_outputは、缶に書かれていることを正確に実行し、この場合、出力変数に格納します。

  • 私の例で行ったようにプールを使用する場合、head -1は単にntpdate出力の一番上の行を取得します(さまざまな結果は大きく変化しないはずですトップがうまくいくように対処してください)。

  • cutは、行をスペース文字で区切られたフィールドとして扱います。オフセット値である6番目のフィールドをソートして選択します。

  • sedはその値から最後の文字を削除します。これはコンマであり、実際に値を使用しようとする試みを台無しにします。

  • Shell = Trueは、シェルを呼び出して証書を実行します。

~~~~~~~~~ [〜#〜] edit [〜#〜] ~~~~~~~~~~~

コメントする担当者もいません、ハ。サーバーが@IramKhanを実行しているpythonのバージョンを教えてください。

python -V

Check_output機能が追加されたときのバージョン<2.7だと思います。その場合、上記を次のように変更する必要があります。

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]

Check_outputが機能しない場合は、これで問題ありません。

1

コマンドの評価にbacktics``を使用し、出力を変数に割り当てます

OFFSET=`ntpdate -q <Server ip address>  |sed 's/.*\(offset\) \([0-9]\.[0-9]\+\).*/\2/'`
if [[ $OFFSET -gt 0.5 ]]; then
   <do something...>
fi
1
user1700494