Почему команда 'at' не печатает на стандартный вывод?

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

Мой вопрос заключается в следующем примере сценария bash, который я создал, почему «Бег» никогда – насколько я могу судить – печатается на стандартный вывод (т. Е. Моя консоль 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 отличается от стандартного вывода?

4 Solutions collect form web for “Почему команда 'at' не печатает на стандартный вывод?”

Потому что at не выполняет команды в контексте сеанса входа в систему. Идея состоит в том, что вы можете запланировать запуск команды в произвольное время, а затем выйти из системы, и система позаботится о запуске команды в указанное время.

Обратите внимание, что на странице руководства at(1) конкретно говорится (мой акцент):

Пользователь будет отправлять стандартную ошибку по почте и стандартный вывод из своих команд, если они есть. Почта будет отправлена ​​с помощью команды / usr / sbin / sendmail.

Поэтому вы должны проверять местную почтовую катушку или, в противном случае, журналы локальной системы. / var / spool / mail / $ USER, вероятно, хорошее место для начала.

Также обратите внимание, что «Started» и «Finished» исходят из внешнего скрипта и сами по себе вообще не имеют никакого отношения. Вы можете вытащить их или at вызове, и вы получите практически тот же результат.

Как пояснил @ MichaelKjörling, любой результат, созданный вами at задании, будет захвачен и отправлен вам по электронной почте. Если у вас нет управляющего агента MTA – Mail Transfer Agent в вашем поле, тогда электронное письмо может находиться в неопределенном состоянии, и вы не будете знать, что он даже пытается это сделать.

MTA – это программа, такая как sendmail или postfix которая может «доставить» электронную почту соответствующему адресату. В этом случае он отправит его в почтовую очередь (файл под каталогом /var/spool/mail ) в вашей локальной системе. Каждый пользователь в системе может иметь очередь в этом каталоге.

В моей системе Fedora, если я запустил sendmail тогда может произойти локальная доставка почты. Я, как правило, его отключить.

 $ sudo service start sendmail 

Теперь мы видим, что моя почтовая очередь для моей учетной записи пользователя saml пуста:

 $ ll /var/spool/mail/|grep saml -rw-rw----. 1 saml mail 0 Jul 12 19:33 saml 

Итак, теперь мы запускаем работу:

 $ at now + 1 minutes <<EOF echo "Running" EOF job 96 at Fri Jul 12 19:38:00 2013 

Мы видим, что работа ожидает выполнения с помощью atq :

 $ atq 96 Fri Jul 12 19:38:00 2013 a saml 

Запустив его снова через пару минут, мы увидим, что работа завершена:

 $ atq $ 

Кстати, с моим запуском MTA теперь я получаю это сообщение в своем терминале:

У вас есть новая почта в / var / spool / mail / saml

Итак, давайте проверим:

 $ ll /var/spool/mail/|grep saml -rw-rw----. 1 saml mail 651 Jul 12 19:38 saml 

Да, у нас есть почта, поэтому давайте проверим ее с помощью mutt :

 $ mutt -f /var/spool/mail/saml 

У нас есть это в «входящей» почтовой очереди:

ss в папке входящих сообщений mutt

Давайте рассмотрим это письмо:

ss сообщения пользователя mutt

И это сработало.

Вышеуказанные ответы являются стандартным / «правильным» способом сделать это.

Другой подход, который проще с точки зрения «конечного пользователя», заключается в том, чтобы любая запланированная или фоновая задача записывала его в файл «log». Файл может находиться в любом месте вашей системы, но если задача выполняется от имени root (от cron и т. Д.), То где-то под / var / log это хорошее место для ее размещения.

Я создал каталог / var / log / maint и сделал его доступным для чтения всем, и у меня есть читаемый файл под названием «backup», где я регистрирую вывод из моих сценариев резервного копирования.

Я создал свой собственный каталог, чтобы мои файлы не смешивались с вещами, генерируемыми системой.

Поместить туда вещи (в bash):

 BACKUP="/var/log/maint/backup" echo "my message" >> "${BACKUP}" 

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

Если у моего скрипта много вывода, я использую скрипт или функцию для вывода, поэтому все делается одинаково. Ниже приведена моя текущая версия (версия overkill): (материал VERBOSE существует, когда я запускаю сценарий с терминала и хочу посмотреть, что происходит для целей отладки.)

 #!/bin/bash ## backup_logger ## backup system logging module ## Copyleft 01/20/2013 JPmicrosystems ## Usage is ${SCRIPT_NAME} [-v] [<caller> <log message text>] ## If present, -v says log to console as well as to the log file ## <caller> is the name of the calling script ## If <caller> <log message text> is not present, write a blank line to the log ## Must be placed in path, like ~/bin ## If log is owned by root or another user, then this must run as root ... ## If not, it just aborts ##source "/home/bigbird/bin/bash_trace" ## debug SCRIPT_NAME="$(basename $0)" USAGE="Usage is ${SCRIPT_NAME} [-v] [<caller> <log message text>]" SYSLOGDIR='/var/log/maint' SYSLOGFILE="${SYSLOGDIR}/backup.log" LOGGING=1 VERBOSE=0 if [ "${1}" == "-v" ] then VERBOSE=1 shift fi ##LOGGING=0 ## debug ##VERBOSE=1 ## debug ## Only zero or two parameters allowed - <caller> <log message text> RC=0 if [ "$#" -eq 1 ] || [ "$#" -gt 2 ] then echo "${USAGE}" RC=1 else if [ ! -w "${SYSLOGFILE}" ] then touch "${SYSLOGFILE}" if [ $? -ne 0 ] then echo -e "$(date) ${1} ${2}" echo "${SCRIPT_NAME} Can't write to log file [${SYSLOGFILE}]" RC=1 exit ${RC} fi fi if [ -n "${1}" ] then (( LOGGING )) && echo -e "$(date) ${1} ${2}" >> "${SYSLOGFILE}" (( VERBOSE )) && echo -e "$(date) ${1} ${2}" else (( LOGGING )) && echo "" >> "${SYSLOGFILE}" (( VERBOSE )) && echo "" fi fi exit $RC 

Я запускаю Debian 8.1 (jessie)
Вы можете получить вывод «at» на терминал с помощью tty.

 $ tty /dev/pts/1 $ at now + 1 min warning: commands will be executed using /bin/sh at> echo 'ZZZZZ' > /dev/pts/1 at> <EOT> 

Через минуту, и «ZZZZZ» появится в вашем терминале …

  • Расписание работы с нерегулярными интервалами
  • Сохраняются ли журналы на прошлой работе?
  • Автоматизировать создание на работе, используя ожидание
  • Выполняется ли моя запланированная задача с помощью команды «at», если я вышел из системы?
  • и летнее время
  • Как я могу видеть предыдущие задания `at`?
  • Что на самом деле будет выполнено?
  • сейчас - разная дата
  • Повторите задачу с помощью команды «at» каждый день в 6 вечера
  • Как перенести на работу раньше?
  • Как отключить вывод по почте для работы на работе?
  • Linux и Unix - лучшая ОС в мире.