Я относительный новичок в Linux. Я пытаюсь узнать, как использовать, at
чтобы я мог запланировать задачи на более позднее время, без использования sleep
. Я смотрел на этот предыдущий вопрос о помощи.
Мой вопрос в следующем примере скрипта bash, который я создал, почему «Running» никогда - насколько я могу судить - не выводится на стандартный вывод (т. Е. На мою консоль bash)?
#!/bin/bash
echo "Started"
at now + 1 minutes <<EOF
echo "Running"
EOF
echo "Finished"
Единственный вывод, который я вижу, например:
Started warning: commands will be executed using /bin/sh job 3 at Fri Jul 12 17:31:00 2013 Finished
Найден ли ответ на мой вопрос в предупреждении? Если так, как /bin/sh
отличается от стандартного вывода?
sleep 3m; echo Running
Ответы:
Потому
at
что не выполняет команды в контексте вашей авторизованной пользовательской сессии. Идея состоит в том, что вы можете запланировать выполнение команды в произвольное время, а затем выйти из системы, и система позаботится о запуске команды в указанное время.Обратите внимание, что страница руководства для
at(1)
специально говорит (мой акцент):Таким образом, вы должны проверять свою локальную почтовую катушку или, в случае неудачи, журналы локальной системы. / var / spool / mail / $ USER, вероятно, хорошее место для начала.
Также обратите внимание, что «Начатый» и «Завершенный» происходят из внешнего сценария и сами по себе не имеют ничего общего с
at
. Вы можете убрать их илиat
вызов, и вы получите по существу тот же результат.источник
Как объяснил @ MichaelKjörling, любой результат, полученный вашей
at
работой, будет записан и отправлен вам по электронной почте. Если в вашем почтовом ящике не запущен агент MTA - Mail Transfer Agent, возможно, электронное письмо находится в подвешенном состоянии, и вы даже не узнаете, чтоat
он пытается это сделать.MTA - это такая программа, которая может
sendmail
илиpostfix
«доставить» электронную почту в соответствующий пункт назначения. В этом случае он будет доставлен в почтовую очередь (файл в каталоге/var/spool/mail
) в вашей локальной системе. Каждый пользователь в системе может иметь очередь в этом каталоге.В моей системе Fedora, если я запускаюсь,
sendmail
может происходить локальная доставка почты. У меня, как правило, есть, хотя.Теперь мы видим, что моя почтовая очередь для моей учетной записи пользователя
saml
пуста:Итак, теперь мы запускаем
at
работу:Мы можем видеть, что работа ожидает выполнения с
atq
:Запустив его снова через пару минут, мы увидим, что
at
работа завершена:Между прочим, с моим запущенным MTA я теперь получаю это сообщение в моем терминале:
Итак, давайте проверим:
Да, у нас есть почта, так что давайте проверим это, используя
mutt
:У нас есть это в "почтовом ящике" нашей почтовой очереди:
Давайте проверим это письмо:
И это сработало.
источник
Я использую Debian 8.1 (jessie).
Вы можете получить вывод 'at' в терминал, используя tty.
Через минуту, и ZZZZZ появится в вашем терминале ...
источник
Приведенные выше ответы являются стандартным / «правильным» способом сделать это.
Другой подход, более простой с точки зрения «конечного пользователя», заключается в том, чтобы любая запланированная или фоновая задача записывала свои выходные данные в файл «журнала». Файл может находиться где угодно в вашей системе, но если задача выполняется от имени пользователя root (из
cron
и т. Д.), То где-то под/var/log
это хорошее место для ее размещения.Я создал
/var/log/maint
каталог и сделал его доступным для чтения всем, и у меня есть читаемый файл под названием «backup», в который я записываю выходные данные из моих скриптов резервного копирования.Я создал свой собственный каталог, чтобы мои файлы не смешивались с вещами, сгенерированными системой.
Чтобы положить вещи там (в Bash):
>>
Приводит к тому , что сообщения будут добавляться к файлу вместо перезаписи его каждый раз.Если у моего сценария много выходных данных, я использую сценарий или функцию для вывода, поэтому все выполняется одинаково. Ниже моя текущая версия (версия с избыточным количеством ресурсов): (материал VERBOSE существует, когда я запускаю скрипт из терминала и хочу посмотреть, что происходит в целях отладки.)
Изменить: упрощенный
at
пример, который пишет в файл пользователяЯ не использовал это вечно, поэтому я понял это с помощью пары простых скриптов.
Первый скрипт просто планирует событие, используя
at
. Сама команда может быть просто набрана в терминале, но я ленив, особенно когда мне приходится делать это несколько раз во время тестирования, не дурачясь с историей команд.Второй сценарий - тот, который планируется запустить
Я создал оба сценария в текстовом редакторе, сохранил их, а затем сделал их исполняемыми
chmod 700 script-file-name
. Я поместил их обоих в свой$HOME/bin
каталог для удобства, но они могут быть где угодно, у моего пользователя есть полный доступ. Я использую700
для любого сценария, который только для тестирования, но в однопользовательской системе, это может быть так же хорошо755
.У меня уже есть каталог
/home/bigbird/log
для сохранения выходных данныхmytest_at_script
. Это также может быть в любом месте, где у вашего пользователя есть полный доступ. Просто убедитесь, что он существует до запуска скрипта или создайте его.Чтобы запустить его, я просто позаботился о том, чтобы время для
at
команды inmytest_at_run
было немного в будущем, а затем запустил его из терминала. Затем я подождал, пока он не побежал, и осмотрел содержимое$HOME/log/at.log
.Несколько заметок:
Несмотря на то, что я работаю
at
от своего пользователя, он не знает мою среду, такую как мойPATH
и мой домашний каталог, поэтому я этого не предполагаю. Я использую полные пути, как я бы для любойcron
работы. И если я когда-нибудь захочу сделать этоcron
работой, мне не придется ничего менять, чтобы заставить это работать.Я использовал
>>
вmytest_at_script
для вывода дописать в файл журнала вместо>
который заменил бы его на каждом запуске. Используйте тот, который подходит вашему приложению лучше всего.источник
at
для записи в файл. Похоже, вы получили последовательность вызовов назад в вашем примере. Я не очень хорошо знаю,at
когда начинать работу, поэтому я просто жестко запрограммировал время в самом ближайшем будущем.