Почему команда '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 отличается от стандартного вывода?

  • и летнее время
  • Что на самом деле будет выполнено?
  • Расписание работы с нерегулярными интервалами
  • Где выходят выходные задания `at` и` cron`?
  • Как распределять файлы / пакеты / программное обеспечение на нескольких дисках?
  • Как я могу видеть предыдущие задания `at`?
  • Автоматизировать создание на работе, используя ожидание
  • Почему atq не задает задания в порядке очереди или в хронологическом порядке?
  • 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» появится в вашем терминале …

    Linux и Unix - лучшая ОС в мире.