추가 읽기

추가 읽기

내가 사용하는 테스트 스크립트는 다음과 같습니다.

last_reboot=$(last reboot | grep 'still running' | awk '{for (i=5; i<=NF; i++) printf $i FS}' | awk '{for (i=1; i<=NF - 2; i++) printf $i FS}')
if [ "$last_reboot" ]; then
    date -d "$last_reboot" '+last reboot: %Y-%m-%d'
fi

days=$(uptime | awk '{print $3}')
hours=$(uptime | awk '{print $5}' | sed -E 's/,$//')
h=$(echo "$hours" | cut -d: -f 1)
m=$(echo "$hours" | cut -d: -f 2)
date -d "- $days days - $h hours - $m minutes" '+uptime: %Y-%m-%d'

who -b | awk '{print "who: " $3}'

journalctl --list-boots | awk '$1 == "0" {print "journalctl: " $4}'

로컬에서는 네 날짜가 모두 일치합니다.

10개 정도의 서버에서 운영하고 있어요. 아무것도 보고되지 않습니다(아마도 회전 last reboot때문일 것입니다 ). 그리고 일치합니다. 그러나 그것은 진실이 아니다. 정확히 무엇 이 보고 됩니까 ? 다른 도구의 보고서와 일치하지 않는 이유는 무엇입니까?wtmplogrotateuptimewho -bjournalctljournalctl --list-boots

답변1

Linux 운영 체제의 새로운 바이너리 로그는 이전 바이너리 로그와 다르게 작동합니다.

이전 바이너리 로그는 /var/log/wtmp및 입니다 /var/log/btmp. 시스템이 부팅되면 wtmp사용자 이름으로 항목이 기록되고, 시스템이 종료되면 reboot사용자 이름으로 항목이 기록됩니다. 시스템이 언제 다시 시작되었는지 확인하려면 및 명령을 사용하여 항목을 인쇄하면 됩니다.wtmpshutdownlast rebootlast shutdown

새 바이너리 로그는 시스템 로그이며 해당 항목이 없습니다.

대신에,일기장마다라는 프로그램이 있습니다.시작 ID. -o verbose옵션을 통해 이를 확인할 수 있습니다 journalctl. 부팅 ID는 부팅 시 커널에 의해 생성되며 systemd-journald커널에서 얻은 현재 부팅 ID는 로그에 추가될 때 각 로그 레코드에 적용됩니다.

list-boots이렇게 하려면 journalctl스캔저널 전체, 타임스탬프와 시작 ID를 읽습니다.각 레코드, 그리고 언급됨최초 및 최신 타임스탬프각 고유 실행 ID와 연결됩니다.

따라서 로그의 일부가 지워지거나 반대로 너무 오랫동안 유지되는 경우 보고된 명백한 시작 및 종료 시간은 journalctl실제 시작 및 종료 시간과 크게 다를 수 있습니다.

/run/utmp시작 및 종료에 대한 특수 항목이 포함된 터미널 로그인 기록 테이블입니다. 이러한 항목은 uptime및 에서 읽습니다 who -b. 이는 시작 및 종료 프로세스의 일부로 실행되는 systemd-update-utmpFreeBSD 명령과 같은 프로그램에 의해 작성 됩니다. utx관련 서비스가 절대적으로 처음이나 마지막에 주문되지 않기 때문에(실제로 주문할 수도 없기 때문에) 처음이나 마지막으로 실행되지 않습니다. 런타임 이전의 관련 부팅 ID가 포함된 로그 항목과 런타임보다 이후의 유사한 로그 항목이 있을 수 있습니다 systemd-update-utmp reboot.systemd-update-utmp shutdown

추가 읽기

관련 정보