Как получить дату / время последней спящей системы / приостановить / возобновить работу системы?

Как получить дату / время этих событий:

  • последний системный спящий режим / приостановка
  • последнее системное возобновление
2
задан 8 September 2019 в 16:47

2 ответа

Поскольку я прокомментировал ответ Commader Байта, по некоторым причинам по крайней мере на моих двух установках Ubuntu 16, кажется, что события "PM: suspend" и "PM: resume" оба записаны в системный журнал во время резюме. Таким образом, приостановить время в том решении - в течение одной секунды то же как время резюме. Однако время резюме корректно.

Таким образом, это решение не основано на файлах журнала. Это основано на очень простом сервисе, работающем непрерывно и контролирующем разницу во времени прежде и после сна. Если различие намного больше, чем время сна затем была "пауза", например, приостанавливает/возобновляет операцию. Пауза зарегистрирована после пробуждения, когда время синхронизируется.

pauselogger.sh

set -e

if [[ "$#" < 1 || "$#" > 1 ]]
then
    echo "Illegal number of parameters"
    echo "Usage $0 <sleeptime in seconds>"
    exit 1
fi

sleepTime=$1
fileName="/var/log/state.log"

dateStr1=$(date "+%Y-%m-%d %T.%N %z %s")
dateInt1=$(echo $dateStr1 | cut -d' ' -f4)
dateInt2=$dateInt1
dateStr2=$dateStr1
diff=0
for (( ; ; ))
do
    diff="$(($dateInt1-$dateInt2))"
    maxDiff=$(echo $sleepTime*1.1 + 1 | bc) # Pause is 10% longer than sleep.
    if (( $(echo "$diff > $maxDiff" |bc -l) )); then  
        echo "$dateStr2 DOWN pre sleep" >> $fileName
        echo "$dateStr1 UP post sleep $diff" >> $fileName       
    fi

    dateStr2=$dateStr1
    dateInt2=$dateInt1

    sleep $sleepTime

    dateStr1=$(date "+%Y-%m-%d %T.%N %z %s")
    dateInt1=$(echo $dateStr1 | cut -d' ' -f4)

done

Сервисным определением является также простой файл:/etc/systemd/system/pauselogger.service

[Unit]
Description=Simple Pause Logger

[Service]
ExecStart=/usr/sbin/pauselogger.sh 30
Restart=on-failure

[Install]
WantedBy=multi-user.target

Регистратор затем запущен и включен:

sudo systemctl start pauselogger
sudo systemctl enable pauselogger

Файл журнала:

2019-09-13 00:44:17.602146211 +0300 1568324657 UP post sleep 225
2019-09-13 01:04:59.968326886 +0300 1568325899 DOWN pre sleep
2019-09-13 10:25:18.575107533 +0300 1568359518 UP post sleep 33619
2019-09-13 10:49:41.594151484 +0300 1568360981 DOWN pre sleep
2019-09-13 10:51:57.129617072 +0300 1568361117 UP post sleep 136

Профессионалы этого решения - то, что оно работает несмотря на команду "пауза". Это записывает паузы, если уровень ОС приостанавливает / в спящем режиме/возобновляет, используется, но это также работает, если используется в VM, например, VirtualBox savestate/resume.

Недостатки по крайней мере, что обе записи в журнале записаны во время пробуждения, это решение не подходит, например, если сценарий необходим, чтобы быть запущенным незадолго до savestate операция. Также сон/пробуждение порождения команды не зарегистрирован: ОС приостанавливает по сравнению с VirtualBox savestate, или резюме ОС по сравнению с VirtualBox запускаются.

0
ответ дан 2 December 2019 в 04:36

Вы могли исследовать свой системный файл журнала /var/log/syslog для сообщений, указывающих, приостанавливают / в спящем режиме/возобновляют события и смотрят на их метки времени.

Для приостанавливают и возобновляют, проверяют, например, этот шаблон:

grep -E 'PM: suspend (entry|exit)' /var/log/syslog

Пример произвел:

Sep  8 09:43:26 type40mark3 kernel: [150509.893804] PM: suspend entry (deep)
Sep  8 15:03:39 type40mark3 kernel: [150514.147721] PM: suspend exit
Sep  8 16:33:41 type40mark3 kernel: [155914.275076] PM: suspend entry (deep)
Sep  8 17:04:58 type40mark3 kernel: [155919.343276] PM: suspend exit

Это только проверяет текущий файл системного журнала, но поскольку он подвергается вращению журнала, старые сообщения будут заархивированы в пронумерованных и сжатых файлах как /var/log/syslog.1 и /var/log/syslog.2.gz. Для проверки всех их сразу использовать zgrep вместо этого, который может считать сжатые файлы, и sort вернуть их в порядке фактической датой метки времени:

zgrep -hE 'PM: suspend (entry|exit)' /var/log/syslog* | sort -M

Для получения только последних двух строк (в последний раз приостанавливают и возобновляются, обычно), можно добавить | tail -n 2 к любой из вышеупомянутых команд.

Если Вы хотите, только приостанавливают или только возобновляют, изменяют шаблон фильтра к, например. PM: suspend entry или PM: suspend exit соответственно.


Я не имею бывшую в спящем режиме систему в наличии прямо сейчас для поиска соответствующих сообщений для того события, но я ожидаю что-то подобное. Попытайтесь искать, например. grep hiber /var/log/syslog найти подходящий шаблон. Когда Вы имеете один, прокомментируйте, и я с удовольствием добавлю его к этому ответу для дальнейшего использования.

Обратите внимание на метки времени, хотя и сравнивают их с фактическим реальным временем, Вы знаете, потому что некоторые "последние" сообщения как systemd[1]: Started Suspend. может быть инициирован прямо, прежде чем система на самом деле выключает, но будет на самом деле зарегистрирована и записана в диск с меткой времени того, когда это включает снова.

1
ответ дан 2 December 2019 в 04:36

Другие вопросы по тегам:

Похожие вопросы: