Просмотрев 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
в выходном файле по мере его просмотра.
Я бы сделал весь тест в 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 ).
В вашем скрипте есть несколько синтаксических ошибок в условии if
, что приводит к сообщению об ошибке, которое вы получаете.
if
вам нужна команда или встроенная тестовая конструкция bash, которая возвращает0
(= true )в случае успеха и не -ноль (= false )в случае неудачи. Вы выбрали арифметическое сравнение, поэтому вам нужно поместить его в соответствующую тестовую конструкцию :. if (( variable1 > variable2 )); then.... ; fi
uptime
, которое содержит число с плавающей запятой -. Однако Bash не может выполнять арифметические операции с плавающей запятой -, поэтому такие выражения не будут работать должным образом. awk
текстовой -обработки как команду, которую нужно выполнить, поэтому пытается «выполнить» текущее время безотказной работы (причина сообщения об ошибке ). Для удобства вы можете урезать секунды до целого числа, используя первое .
в качестве разделителя полей. Итак, вы можете попробовать
up=$(awk -F. '{print $1}' /proc/uptime)
if (( up > 72*3600 )); then echo "yes"; else echo "no"; fi
Обратите внимание
((... ))
. Если вы хотите, чтобы скрипт был переносимым, вы должны использовать совместимый с POSIX -if [ $up -gt 259200 ]; then...; else...; fi
shellcheck
, также доступную как отдельная программа во многих дистрибутивах Linux, для обнаружения синтаксических ошибок и тому подобного. #! /bin/bash
if [ $(awk '{print int($1/3600)}' /proc/uptime) -gt 72 ]; then
echo "yes"
fi
Все это можно сделать в 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
Таймер 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