Tôi thấy rằng tôi có thể lấy thông tin thời gian đến một phần trăm giây từ /proc/uptime
một hệ thống nhúng Linux với busybox, mặc dù việc chuyển đổi nó thành thời gian kỷ nguyên là khó khăn vì tôi không thể tìm thấy bất kỳ bản ghi nào về thời gian khởi động.
Đây là một số mã sh nhanh:
read UPTIME < /proc/uptime
UPTIME="${UPTIME%%[^0-9.]*}"
Nếu tất cả những gì bạn cần là một bộ đếm thời gian với độ chính xác đến 100 giây, thì điều này là đủ tốt (thời gian 0, thời gian địa phương của bạn, sẽ chỉ là thời gian hệ thống khởi động).
Nếu không, bạn có thể gian lận và kích hoạt một mục nhật ký:
printf '\u04' |nc $HOSTNAME 22 >/dev/null 2>&1 # trigger log entry by poking ssh
LOG="$(logread -l 1 -t)" # read last log entry w/ timestamp
LOG="${LOG##* 20?? \[}" # remove text before timestamp
echo "${LOG%%\]*}" # remove text after timestamp
Điều này tiêu tốn 0,026 giây (trung vị; min = 0,025s, max = 0,028s, trong số 12 lần chạy). Cũng lưu ý rằng nó làm ô nhiễm nhật ký của bạn ... và tôi không biết điều gì xảy ra khi nhật ký "quá lớn" (đối với bất kỳ giá trị nào); ghi nhớ nhật ký được lưu trữ trong bộ nhớ.
Do đó, nếu bạn sẽ bỏ phiếu nhiều thời gian, có lẽ bạn chỉ nên tạo một mục nhật ký xấu ngay từ đầu và kết hợp hai phương pháp trên như sau:
get_uptime_ms() {
local MS
read UPTIME < /proc/uptime
UPTIME="${UPTIME%%[^0-9.]*}" # strip the other listed time
MS="${UPTIME##*.}0" # extra zero turns 100ths of seconds into 1000ths
UPTIME="${UPTIME%%.*}$MS" # the time since boot in milliseconds
}
get_uptime_ms
printf '\u04' |nc $HOSTNAME 22 >/dev/null 2>&1 # poke ssh to trigger log entry
NOW="$(logread -l 1 -t)" # last log entry, with timestamp
NOW="${NOW#* 20?? \[}" # remove text before timestamp
NOW="${NOW%%\]*}" # remove text after timestamp
MS="${NOW##*.}" # just the milliseconds
NOW="${NOW%%.*}$MS" # append ms to s w/out dot
BOOT=$(( NOW - UPTIME ))
date_ms() {
local S
get_uptime_ms
NOW=$(( BOOT + UPTIME))
S="${NOW%???}" # $NOW in seconds
echo "$S.${NOW#$S}" # put the dot back in, then append milliseconds
}
# now you can run date_ms as much as you like
# and it'll have the epoch time with millisecond precision.
date_ms
date +%s
date_ms
Điều này thiết lập một cái gì đó để sử dụng làm thời gian khởi động ban đầu bằng cách trừ thời gian hoạt động (xuống 100 giây) từ dấu thời gian của trình kích hoạt nhật ký (chính xác đến 1000 giây) và sau đó cập nhật nó với thời gian hoạt động. Do đó, điều này mang lại 100 giây của một giây chứ không phải 1000 giây, nhưng nó chỉ đưa thêm một mục nhập vào logd và phương pháp khác không chính xác hơn nhiều vì nó tốn 0,026 giây để chạy. (Nó phù hợp với hệ thống của tôi, vì vậy bạn có thể xem xét việc chạy nó một loạt lần và trừ đi giá trị đó.)
date --rfc-3339=ns