Как проверить, превышает ли время безотказной работы 72 часа?

Просмотрев man less, я обнаружил следующие варианты:

-ofilename or --log-file=filename
              Causes less to copy its input to the named file as it is being viewed.  This applies only when the input file is a pipe, not an ordinary file.  If the file already exists, less will  ask  for
              confirmation before overwriting it.

       -Ofilename or --LOG-FILE=filename
              The -O option is like -o, but it will overwrite an existing file without asking for confirmation.

              If  no  log file has been specified, the -o and -O options can be used from within less to specify a log file.  Without a file name, they will simply report the name of the log file.  The "s"
              command is equivalent to specifying -o from within less.

Таким образом, если вы сделаете что-то вроде cat big_file.txt | less --log-file=output.txt, вы получите результат lessв выходном файле по мере его просмотра.

0
14.09.2021, 07:06
5 ответов

Я бы сделал весь тест в AWK:

awk '$1 > (72 * 3600) { print "yes" }' /proc/uptime

Если вы хотите использовать это как тест, используйте код выхода:

if awk '{ exit ($1 < (72 * 3600)) }' /proc/uptime; then
    echo Need to reboot
fi

AWK оценивает ($1 < (72 * 3600))как 0, если сравнение не удается, и 1 в противном случае; 0 указывает на успех в качестве кода выхода, поэтому мы инвертируем условие.

Если вы используете systemd, другим подходом может быть использование таймера systemd, сOnBootSec=72h(см. подробности в ответе FelixJN ).

5
14.09.2021, 07:25

В вашем скрипте есть несколько синтаксических ошибок в условии if, что приводит к сообщению об ошибке, которое вы получаете.

  1. В условии ifвам нужна команда или встроенная тестовая конструкция bash, которая возвращает0(= true )в случае успеха и не -ноль (= false )в случае неудачи. Вы выбрали арифметическое сравнение, поэтому вам нужно поместить его в соответствующую тестовую конструкцию :.
    if (( variable1 > variable2 )); then.... ; fi
    
  2. Вы используете обработку содержимого uptime, которое содержит число с плавающей запятой -. Однако Bash не может выполнять арифметические операции с плавающей запятой -, поэтому такие выражения не будут работать должным образом.
  3. Поскольку вы не поместили условие в тестовую конструкцию, Bash рассматривает результат вашей awkтекстовой -обработки как команду, которую нужно выполнить, поэтому пытается «выполнить» текущее время безотказной работы (причина сообщения об ошибке ).

Для удобства вы можете урезать секунды до целого числа, используя первое .в качестве разделителя полей. Итак, вы можете попробовать

up=$(awk -F. '{print $1}' /proc/uptime)
if (( up > 72*3600 )); then echo "yes"; else echo "no"; fi

Обратите внимание

  • Вопрос помечен , поэтому я использовал тестовую конструкцию -, специфичную для bash ((... )). Если вы хотите, чтобы скрипт был переносимым, вы должны использовать совместимый с POSIX -
    if [ $up -gt 259200 ]; then...; else...; fi
    
  • Как правило, я бы рекомендовал вам запускать сценарии оболочки через shellcheck, также доступную как отдельная программа во многих дистрибутивах Linux, для обнаружения синтаксических ошибок и тому подобного.
2
14.09.2021, 07:27
#! /bin/bash

if [ $(awk '{print int($1/3600)}' /proc/uptime) -gt 72 ]; then
    echo "yes"
fi
0
14.09.2021, 07:27

Все это можно сделать в bash, преобразовав даты в временные метки и выполнив некоторые вычисления. Вы можете использовать uptime -s, так что не нужно awk или что-то еще

#!/usr/bin/env bash

upt=$(date -d "$(uptime -s)" +%s)
hours=$(date -d '72 hours ago' +%s)

if (( upt < hours)); then echo "System up for at least 72h"; else echo "Nothing to do"; fi
1
14.09.2021, 08:00

Таймер systemd тоже подойдет:

[Unit]
Description=reboot after 72h
 
[Timer]
Unit=systemd-reboot.service
OnBootSec=72h

[Install]
WantedBy=multi-user.target

Обратите внимание, что это не сервис, а таймер, т.е. имя файла должно заканчиваться на .timer. Вставьте его, например. /etc/systemd/system/reboot27h.timer, затем включите и запустите его для текущего сеанса, как обычно:

systemctl enable reboot72h.timer
systemctl start reboot72h.timer

Чтобы проверить, правильно ли работает таймер и сколько времени осталось до следующего запуска, используйте

systemctl list-timers
5
14.09.2021, 08:32

Теги

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