Что означает '> / dev / null 2> & 1' в этой статье основы crontab?

Я читаю статью о crontab

Есть что-то в отключении автоматической отправки писем.

  1. Отключить электронную почту По умолчанию задания cron отправляют электронное письмо на учетную запись пользователя, выполняющую cronjob. Если это не требуется, введите следующую команду. В конце строки задания cron.

    >/dev/null 2>&1 

Что такое подробное значение для 2 > & и 1 ? Зачем положить это в конец файла crontab, чтобы отключить отправку электронной почты?

> для перенаправления

/dev/null – это черная дыра, в которой любые отправленные данные будут отброшены

2 – файловый дескриптор стандартной ошибки

> для перенаправления

& является символом дескриптора файла (без него следующее 1 будет считаться именем файла)

1 является файловым дескриптором для стандартного вывода

Поэтому >/dev/null 2>&1 перенаправляет вывод вашей программы на /dev/null . Включите Standard Error и Standard Out Standard Error .

Гораздо больше информации доступно на странице перенаправления ввода-вывода проекта документации Linux.

cron будет отправлять вам только по электронной почте, если есть какой-то результат работы. Когда все перенаправлено на null , выхода нет, и, следовательно, cron не будет отправлять вам по электронной почте.

/dev/null – это файл устройства, который действует как черная дыра. Все, что написано на нем, отбрасывается или исчезает. Когда вы запускаете скрипт, который дает вам выход, и если мы добавим в конец скрипта файл > /dev/null 2>&1 , мы попросим сценарий написать все, что генерируется из скрипта (как вывод, так и ошибка сообщений) в /dev/null .

Разбить его:

  • 2 – ручка для стандартной ошибки или STDERR
  • 1 – это ручка для стандартного вывода или STDOUT

2>&1 просит направить все STDERR как STDOUT (т. STDERR STDOUT все сообщения об ошибках, сгенерированные из сценария в качестве стандартного вывода). Теперь у нас уже есть > /dev/null в конце скрипта, что означает, что весь стандартный вывод ( STDOUT ) будет записан в /dev/null . Поскольку STDERR теперь переходит в STDOUT (из-за 2>&1 ), оба STDERR и STDOUT заканчиваются в blackhole /dev/null . Другими словами, скрипт отключен.

Кстати, вам нужно иметь > перед /dev/null 2>&1 . Должен быть:

 x * * * * /path/to/my/script > /dev/null 2>&1 

Это стандартное перенаправление ввода-вывода.

Всегда открыты три файла по умолчанию.

  • stdin (0)
  • stdout (1)
  • stderr (2)

Поэтому в этом примере stdout ( 1 ) перенаправляется на /dev/null .

null устройство – это файл устройства, который отбрасывает все записанные на него данные.

Затем stderr затем перенаправляется в stdout ( 2>&1 ), поэтому оба stdout и stderr будут идти в /dev/null

Поэтому размещение этого в конце задания crontab будет подавлять весь вывод и ошибки из команды.

Справка

Перенаправление ввода-вывода

Из руководства cron (8) :

При выполнении команд любой вывод отправляется владельцу crontab […].

Так что ваша статья предлагает здесь не производить никаких результатов, не отправляя почты. Другой способ (более удобный?) Отключить почту – использовать опцию -m off , т.е.

 crond -m off 

Теперь к синтаксису: это специфично для языка оболочки Bourne (и его производных, таких как bash , zsh и т. Д.).

 [n]>file [n]>fd 

будет перенаправлять на дескриптор файла n (или стандартный вывод, если не указано), в файл дескриптор fd .

Файловый дескриптор может быть именем файла адреса потока. & является оператором адресов, как на языке C.

Обычно дескриптор 1 файла является стандартным выходом (aka stdout ), а дескриптор файла 2 является стандартной ошибкой (aka stderr ). Кусок

 >/dev/null 

перенаправляет stdout на / dev / null.

 '2>&1' 

перенаправляет поток ошибок в выходной поток, который был перенаправлен на / dev / null. Таким образом, никакой выпуск не производится, и никакая почта не отправляется.

Предупреждение: порядок перенаправления имеет значение:

 >/dev/null 2>&1 

это не то же самое, что

 2>&1 >/dev/null 

Попробуйте эти две команды с непривилегированным пользователем:

 ls >/dev/null 2>&1 ls 2>&1 >/dev/null 

В самом деле, в более позднем случае файловый дескриптор 2 устанавливается на текущий адрес файлового дескриптора “ 1 (который является stdout в этот самый момент), а затем дескриптор файла 1 перенаправляется на /dev/null . Файловый дескриптор 2 по-прежнему перенаправляется на stdout , независимо от того, что происходит с дескриптором файла 1 .

Обычно, когда cron выполняет cronjob, он отправляет вывод команды, заданной в cronjob, в учетную запись пользователя, выполняющую cronjob. Поэтому, когда ваш cronjob выполняет uptime например, вывод uptime отправляется пользователю по электронной почте.

Чтобы быть понятным, подразумевается стандартный вывод ( stdout ) команды. Теперь, если вы выполняете время выполнения команды в кукурузе следующим образом:

 uptime >/dev/null 2>&1 
  • 2>&1 означает перенаправление канала 2 ( stderr ) на канал 1 ( stdout ). Оба выхода теперь находятся на одной и той же канале ( 1 ).
  • >/dev/null : означает, что стандартный вывод (и стандартный вывод ошибки) отправляется в /dev/null . /dev/null – специальный файл:

Данные, записанные в нулевой или нулевой специальный файл, отбрасываются.

Таким образом, вы отказываетесь от вывода, и cron не может отправить ничего.

В справочном руководстве Redirection Bash говорится:

Оператор [n]> & word используется […] для дублирования дескрипторов выходных файлов. Чтобы перенаправить как stderr, так и stdout в файл, вы должны использовать форму &> файл ….

кратко: все сообщения STDERR и STDOUT будут перенаправлены на /dev/null