ฉันได้อัปโหลดสคริปต์ทุบตีเป็นส่วนสำคัญไปยังบัญชี Github ของฉันที่print_osx_uptimes.shซึ่งอาจช่วยตอบคำถามของคุณแม้ว่าจะไม่ใช่สิ่งที่ถูกถาม (ซึ่งมีความซับซ้อนมากขึ้น)
สคริปต์จะสอบถามสิ่งอำนวยความสะดวกของ Apple System Log (ASL) สำหรับข้อความ 'ปิดระบบ' ค่าของฟิลด์ 'ข้อความ' ประกอบด้วยเวลาในการทำงานของระบบเมื่อเหตุการณ์การปิดระบบซึ่งฉันคิดว่าอาจใกล้เคียงกับคำถามของโปสเตอร์ต้นฉบับอย่างสมเหตุสมผล
จากนั้นแปลงวินาทีของเวลาทำงานเป็นรูปแบบที่อ่านได้ง่ายขึ้นซึ่งแสดงวันชั่วโมงนาทีและวินาที
ทดสอบบน OS X 10.10.5 แต่ไม่เห็นเหตุผลว่าทำไมไม่ควรทำงานตั้งแต่ 10.7 เป็นต้นไป (อาจเป็นไปได้เช่นกัน 10.6)
โค้ดที่แก้ไขเพื่อตรวจสอบข้อความ (duh) 'reboot' และอัปเดตผลลัพธ์เพื่อแสดงประเภทของเหตุการณ์ (เช่นชื่อผู้ส่ง) สำหรับแต่ละรายการ
ตัวอย่างผลลัพธ์:
$ ./print_osx_uptimes.sh
Shutdown on date/time: Event Reported uptime of:
============================= ========= ===================================
Mon Jul 6 2015 10:32:21 EDT shutdown 1 days 11 hrs 30 min 15 secs
Thu Jul 16 2015 20:47:24 EDT reboot 1 days 22 hrs 15 min 46 secs
Thu Jul 16 2015 22:01:50 EDT shutdown 0 days 21 hrs 4 min 28 secs
Sun Jul 19 2015 02:10:34 EDT shutdown 2 days 16 hrs 35 min 35 secs
Tue Jul 21 2015 19:32:35 EDT shutdown 9 days 17 hrs 41 min 46 secs
Fri Jul 24 2015 20:35:05 EDT shutdown 9 days 7 hrs 55 min 38 secs
Sat Jul 25 2015 00:03:13 EDT shutdown 8 days 10 hrs 45 min 8 secs
Tue Jul 28 2015 09:16:47 EDT shutdown 5 days 21 hrs 20 min 57 secs
Thu Jul 30 2015 22:32:36 EDT shutdown 10 days 0 hrs 3 min 59 secs
Tue Aug 4 2015 01:37:32 EDT shutdown 7 days 4 hrs 24 min 35 secs
Fri Aug 14 2015 19:15:04 EDT reboot 5 days 22 hrs 42 min 1 secs
เนื้อของสคริปต์ใน Github Gist คือ:
#!/bin/bash
# https://gist.github.com/jps3/afc1e374b632e1ed1ebc
# function displaytime() is a modified form of that from:
# http://unix.stackexchange.com/a/27014
function displaytime {
local T=$1
local D=$((T/60/60/24))
local H=$((T/60/60%24))
local M=$((T/60%60))
local S=$((T%60))
printf '%5s days %2s hrs %2s min %2s secs' $D $H $M $S
}
function get_syslog_entries () {
syslog -d store \
-F '$(Sender) $(Message)' \
-k Sender Req '^(shutdown|reboot)$' \
-k Message Req "SHUTDOWN_TIME"
}
while read -a line; do
sender="${line[0]}"
log_entry_timestamp="$(date -j -f %s "${line[2]}" +"%a %b %e %Y %T %Z")"
uptime_timestamp="$(displaytime "${line[3]}")"
printf "%s %-8s %s\n" "${log_entry_timestamp}" "${sender}" "${uptime_timestamp}"
done < <(get_syslog_entries)
หวังว่านี่จะช่วยได้ ฉันพยายามทำความสะอาดสคริปต์และทำให้ส่วนต่างๆและความคิดเห็นมีประโยชน์