내 Linux 컴퓨터에서는 시간이 멈추지 않습니다. 토요일에만 발생하는 문제에 대해 서버를 테스트해야 합니다.
- CentOS 6.5 64비트
- NTPD를 껐습니다. (
service ntpd stop
그리고chkconfig ntpd off
) - 가상 BIOS/하드웨어 시계를 2015년 5월 2일로 설정했습니다.
- 시간을 미래 또는 과거로 변경해도 동일한 효과가 있습니다.
- 명령줄에서 날짜를 설정했습니다.
date --set "02 May 2015 11:00:00"
date
정답 및 표시일은 2015년 5월 2일입니다.cron.d
, 등cron.daily
은cron.hourly
time/ntp와 관련이 없습니다.
몇 분 후에 시간이 자동으로 올바른 날짜로 돌아갑니다.
시간을 끊임없이 바꿀 수 있는 또 다른 것은 무엇입니까? 정보는 어디서 얻나요? ?
답변1
이 답변에 대해서는 타이밍을 조정하는 데 도움이 되는 몇 가지 요소가 있다고 가정합니다. 난 정말 무작위로 추측하고 싶지 않기 때문에어느 것당신에게 해를 끼치더라도, 나는 당신이 스스로 찾는 데 도움이 될 답변을 제공하려고 노력할 것입니다.
UNIX 시스템에서는 일반적으로 시스템 호출을 사용하여 시계를 설정할 수 있습니다 stime
. 상황이 진행됨에 따라 호출을 사용하여 시계를 보다 정확하게 설정하는 것도 가능해졌습니다 clock_settime
. 당신도 그것을 만날 수 있습니다 settimeofday
. date --set
CentOS 시스템에서 strace
실행 하면 clock_settime
.
이를 알면 해결책은 이러한 시스템 호출을 추적하는 것입니다. 좋은 소식은 Linux에 debugfs라는 메커니즘이 있다는 것입니다. 내 시스템에서 을(를) 호출하면 다음 mount
위치에서 해당 기능을 사용할 수 있음을 알 수 있습니다 /sys/kernel/debug
.
$ mount
none on /sys/kernel/debug type debugfs (rw)
...
그러나 일부 시스템(RedHat 및 CentOS 포함)에서는시작시 설치되지 않습니다. 그럼 달려야지...
# mount -t debugfs nodev /sys/kernel/debug
또한 설치하기 전에 이 디렉토리에 있었다면 파일이 여기에 나타나기 시작하기 전에 종료하고 돌아와야 할 수도 있습니다.
이제 우리는 갈 준비가 되었습니다. 시스템 호출 추적을 활성화해 보겠습니다. 실제로 어떤 것이 사용되고 있는지 확인하고 싶지 않기 때문에 모두 추적하고 있습니다. 시스템 호출 추적은 에서 설정할 수 있습니다 /sys/kernel/debug/tracing/events/syscalls
. 이 디렉토리에서 다음을 찾아야 합니다...
sys_enter_stime
sys_enter_clock_settime
sys_enter_settimeofday
...시스템에서 사용 가능한 항목에 따라 다릅니다.
이에 해당하는 이벤트입력하다우리의 시스템 호출은 우리가 추적하려는 것입니다( sys_exit_*
디렉토리도 찾을 수 있습니다). 각 디렉토리에는 이름이 0인 파일이 있습니다 enable
. 해당 내용은 0이어야 합니다. 이러한 통화를 추적하려면 이 값을 1로 설정하세요.
# echo 1 > /sys/kernel/debug/tracing/events/syscalls/sys_enter_stime/enable
# echo 1 > /sys/kernel/debug/tracing/events/syscalls/sys_enter_clock_settime/enable
# echo 1 > /sys/kernel/debug/tracing/events/syscalls/sys_enter_settimeofday/enable
이제 함정을 설정했으므로 시간이 올바른 값으로 설정될 때까지 기다리기만 하면 됩니다. 이 문제가 발생하면 다음에서 추적 로그를 실행하십시오.
# cat /sys/kernel/debug/tracing/trace
이제 오류가 발생하지 않는 한 다음 줄 중 하나가 표시됩니다.
stime-xxxxx [xxx] .... x.x: sys_stime(...)
clock_settime-xxxxx [xxx] .... x.x: sys_clock_settime(...)
settimeofday-xxxxx [xxx] .... x.x: sys_settimeofday(...)
바로 뒤에 오는 숫자 stime-
(또는 다른 호출의 이름)는 시스템 호출을 수행하는 프로세스의 PID입니다. 이제 가서 가져오세요:
# ps -fp xxxxx
UID PID PPID C STIME TTY TIME CMD
root XXXXX XXXXX 0 hh:mm ? hh:mm:ss time_warrior
이제 시스템이 올바른 시간을 가져오는 것을 중지하는 데 필요한 모든 것이 갖추어져 있습니다. 가장 간단한 방법은 프로세스를 종료하고 시작 시 프로세스가 생성되지 않도록 하는 것입니다. 물론 더 이상 서비스를 제공하지 않도록 해야 합니다.중요한이 작업을 수행하기 전의 목적은 시스템이 완전히 충돌하는 것을 원하지 않는다는 것입니다...
또한 작업이 끝나면 이전에 편집한 파일에 0을 써서 추적을 비활성화하는 것을 기억하세요. 단축키는 다음과 같습니다.
# echo 0 > /sys/kernel/debug/tracing/events/syscalls/enable
(이 파일은 다음과 같은 역할을 합니다.메인 스위치다른 모든 경우에는 모든 시스템 호출 추적을 끌 수 있습니다.
노트:Mark Plotnick이 댓글에서 말했듯이, 이는 systemtap
유사한 결과를 얻는 약간 더 쉬운 방법일 수 있습니다. 나는 스크립팅에 전혀 익숙하지 않기 stap
때문에 그가 원한다면 답변을 쓰도록하겠습니다 .stap
답변2
당신이 가지고 있다면시스템 수도꼭지일단 설치되면(CentOS 시스템의 경우일 수 있음) 시스템 전체에서 이루어진 모든 시스템 호출을 쉽게 추적할 수 있습니다.
# cat clock.stp
probe nd_syscall.stime, nd_syscall.settimeofday, nd_syscall.clock_settime {
printf("process %d (%s) called %s(%s) at %d\n", pid(), execname(), name, argstr,
gettimeofday_us());
}
# stap clock.stp
이를 테스트하려면 다른 창에서 다음을 실행하세요.
# date 04301056
Thu Apr 30 10:56:00 EDT 2015
stap의 출력은 다음과 같습니다.
process 7520 (date) called clock_settime(CLOCK_REALTIME, [1430405760.000000000]) at 1430405782997282