오프셋 시간이 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