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

관련 정보