2

Я пытался использовать в, чтобы запланировать работу, выполняемую в определенное время. У меня есть компьютер Mac. Например, я попытался проверить это следующим образом в терминале:

at now + 1 minute
echo 'Test at'
<EOD>

спустя более 1 минуты я не увидел эха. После того, как я наберу следующую команду:

at -l

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

Мой первый вопрос: я не уверен, является ли это поведением по умолчанию для команды или нет. Есть ли способ изменить это поведение и как изменить его, направить результат туда, где это возможно.

Насколько я понимаю, если в моей запланированной работе есть какое-либо сообщение, и выходное сообщение будет отправлено обратно на мою почту. Мой следующий связанный вопрос: я не уверен, где выполняется запланированное задание? В фоновом режиме? Я не мог найти его с помощью команды fg или bg.

2 ответа2

4

Да, отправка почты пользователю, вызвавшему команду at, является поведением по умолчанию.

На странице man:

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

В результате вышесказанного, нет простого способа сообщить о выходе команд. Конечно, вы можете перенаправить вывод в файл или использовать альтернативный механизм для передачи вывода, как часть команд.

Если вы не видите запланированное задание, это потому, что в системе работает демон atd, который получает и выполняет задания at. На Mac они могут обрабатываться демоном launchd , который является заменяющим демоном Apple:

Демон launchd по сути является заменой сценариев init, rc, init.d и rc.d, SystemStarter (Mac OS X), inetd и xinetd, atd, crond и watchdogd. Apple заявила, что намерена отказаться от всех вышеперечисленных сервисов в пользу запуска

3

Это действительно стандартное поведение at, как указано в man at:

Пользователю будет отправлена стандартная ошибка по почте и стандартный вывод из его команд, если таковые имеются. Почта будет отправлена с помощью команды sendmail(8). Если at выполняется из оболочки su(1), владелец оболочки входа получит письмо.

Для другого поведения , вы можете вызвать на так:

$ at now + 1 minute 
$ echo "test at" > /dev/ttys000
$ <EOD>

Который будет перенаправлять STDOUT на терминал ttys000. Вам необходимо заменить /dev/ttys000 на соответствующий файл устройства вашего терминала, который вы можете определить, выполнив следующую команду:

$ tty

Запланированные задания выполняются в их собственной оболочке (подробнее см. В man ), так что bg не будет их перечислять. Чтобы увидеть список запланированных заданий, вы можете попробовать atq или at -l

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .