Самый простой способ - просто нажать ctrl+alt+del для мягкого сброса, но вам придется снова пройти POST.
Другой способ, из приглашения к спасению:
замените hd0,gpt2
на соответствующее значение для вашей машины - в моей системе оно отображается как часть приглашения пароля. Я использую btrfs без lvm (и без отдельного раздела /boot), поэтому ваши параметры cryptomount и prefix могут несколько отличаться от моих:
cryptomount hd0,gpt2
set prefix=(crypto0)/__active/boot/grub
insmod normal
normal
Возможно, я не продумывал это до конца, но
* * * * * yourthing.sh >/tmp/yourthing.log && rm -f /tmp/yourthing.log; cat /tmp/yourthing.log 2>/dev/null
в обычных случаях перенаправляет все во временный файл (вы, вероятно, захотите использовать mktemp
для получения уникального имени файла), удалите его, если файл был успешно создан, а затем снова cat
содержимое, если оно все еще существует (т.е. хрон почтовик.
Если не изменяет память, cron уже ничего не отправляет, если не было вывода, так что если лог-файл пустой или не существует, ничего не происходит. (Мы перенаправляем сообщение об ошибке.)
Команда chronic
из moreutilsвыполняет команду спокойно, если она не завершается ошибкой.
Цитата из его руководства:
Chronic запускает команду и принимает меры, чтобы ее стандартный вывод и стандартная ошибка отображались только в случае сбоя команды (выход ненулевой или сбой). Если команда выполнена успешно, любой посторонний вывод будет скрыт.
Хронический обычно используется для запуска задания cron. Вместо того, чтобы пытаться держать команду в секрете и иметь дело с сообщениями, содержащими случайный вывод, когда он завершается успешно, и недостаточно подробным выводом, когда он терпит неудачу, вы можете просто всегда запускать его подробно и использовать хронический, чтобы скрыть успешный вывод.
Как я могу получать электронные письма от cron только в случае ошибок?
Вы можете обернуть свои вызовы cron с помощью cronic, сценария оболочки, который потребляет выходные данные cron, если только код возврата вызванного процесса не равен нулю или нет вывода ошибки трассировки.
Чтобы использовать cronic, загрузите скрипт в подходящее место, например /usr/local/bin
. Ваши записи в crontab должны начинаться с пути к скрипту (например, /usr/local/bin/cronic
) или просто cronic
, при условии, что ваш PATH
установить правильно.
Обратите внимание, что термин «ошибки» в вашем вопросе является нечетким и требует тщательного определения. Чтобы cronic был полезен, вы должны убедиться, что задания, в которые вы переносите сообщения об ошибках cronic, одним из способов, которыми он определяет состояние ошибки. Неявные методы создания отчетов, такие как запись текстовых строк в STDOUT
, потребуют дальнейшего рассмотрения, чтобы сделать их совместимыми с cronic или другим механизмом отчетов cron.
Доступны и другие обертки, ссылки на которые можно найти на сайте cronic:
Поскольку вы не заботитесь о выводе, вы можете перенаправить STDOUT задания на /dev/null
и разрешить отправку STDERR по почте ( используя переменную окружения MAILTO
).
Так, например:
...
...
MAILTO=foobar@example.com
...
...
* * * * * /my/script.sh >/dev/null
будет отправлять почту, когда есть вывод только на STDERR (с STDERR), и отбрасывает STDOUT.
Это, конечно, предполагает, что когда программа записывалась в STDERR, произошел сбой; это может быть не всегда так. Если у вас есть контроль над программой, вы можете заставить ее это делать. Для любого сложного случая вы должны написать какую-нибудь оболочку, которая запускает команду (команды) и соответственно отправляет почту. И поместите обертку как задание cron
.
Вот еще один вариант, который я успешно использовал в течение многих лет -захвата вывода и вывода его только при ошибке . Для этого не требуются временные файлы, и сохраняет все выходные данные . Важной частью является 2>&1
, который перенаправляет STDERR на STDOUT.
1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT"
1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT" | mail -s "Failed to backup" an@email.address
1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || {echo "$OUTPUT" ; ls -ltr /backup/dir ; }
Это будет работать для простых команд. Если вы имеете дело со сложными каналами (find / -type f | grep -v bla | tar something-or-other
), вам лучше перенести команду в скрипт и запустить скрипт, используя вышеупомянутый подход. Причина в том, что если какая-либо часть канала выводит в STDERR, вы все равно будете получать электронные письма.