Pythonの変数からntpdateオフセット値を取得します。

Pythonの変数からntpdateオフセット値を取得します。

オフセット時間が0.5秒より大きいことを確認し、いくつかのことをしたいと思います。コマンドを実行しています。ntpdate -q <Server ip address>

追加のタスクを実行できるように、変数からオフセット値を取得する方法を教えてください。

答え1

解決策

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コマンドの出力の最初の行に指定されたオフセットを使用すると、その数値で必要なすべての操作を実行できます。

if output > X:
    do something...

説明する

あなたはntpdateが何をしているのかをすでに(明らかに)知っているので、それが返す出力には何をしたいのかについて役に立たない情報がたくさんあることを知っています。

  • 子プロセスを使用すると、Pythonスクリプトでbashコマンドを実行できます。

  • check_outputは正確に言うとおりに行われます。この場合、出力変数に保存します。

  • 私の例のようにプーリングを使用している場合、head -1はntpdate出力の一番上の行だけを取得します(さまざまな結果)。してはいけないたくさん変わるので上部は大丈夫そうです。)

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

  • sedは値から最後の文字であるカンマを削除し、実際に値を使用しようとするすべての試みを中断します。

  • shell=True はシェルを呼び出して操作を実行します。

~~~~~~~~編集する~~~~~~~~~~~

私もコメント月の代表がないですね、ハハ。 @Iram Khanサーバーで実行されている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が機能しない場合は、これを行うだけです。

答え2

コマンドの評価と変数への出力の割り当てにバックティック「」を使用します。

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

関連情報