Почему делает это 'при' команде не печатает к стандартному выводу?

Используйте файловую систему FUSE, которая позволяет Вам просматривать архивы как каталоги, такие как AVFS. Использовать cp извлечь файлы к каталогу по Вашему выбору.

mountavfs
cp -Rp ~/.avfs/tmp/omeka-1.5.1.zip\#/omeka-1.5.1 omeka

Так как мы предполагаем, что существует единственный каталог верхнего уровня в архиве, можно сократить это к

cp -Rp ~/.avfs/tmp/omeka-1.5.1.zip\#/* omeka

15
13.04.2017, 15:37
4 ответа

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

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

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

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

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

18
27.01.2020, 19:49

Поскольку @MichaelKjörling объяснил это любой вывод, это производится Вашим at задание будет получено и отправлено Вам по электронной почте. Если у Вас нет рабочего MTA - Агент Передачи почты на Вашем поле затем, электронная почта может быть в неопределенности, и Вы не будете знать это at даже пытается сделать это.

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 задание:

$ 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

При выполнении его снова после нескольких минут мы видим что at задание завершено:

$ 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 of mutt's inbox

Давайте проверим эту электронную почту:

     ss of mutt's msg

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

8
27.01.2020, 19:49
  • 1
    @MichaelKjörling - попытка дурака rulz 8-) –  slm♦ 13.07.2013, 15:13

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

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

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

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

Помещать материал там (в ударе):

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

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

Если мой сценарий имеет большой вывод, я использую сценарий или функцию для вывода, таким образом, все сделано то же. Ниже мой ток (версия излишества): (ПОДРОБНЫЙ материал там для того, когда я запускаю скрипт от терминала и хочу видеть то, что продолжается для отладки целей.)

#!/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

Править: Упрощенный at пример, который пишет в пользовательский файл

Не использовали это в навсегда, таким образом, я понял это с несколькими простыми сценариями.

Первый сценарий просто планирует использование события at. Сама команда могла просто быть введена в терминал, но я ленив - особенно, когда я должен сделать это многократно при тестировании ее, не играя с историей команд.

#!/bin/bash
## mytest_at_run
## Schedule a script to run in the immediate future
echo "/home/bigbird/bin/mytest_at_script" | at 00:56

Второй сценарий является тем, который, как планируют, будет работать

#!/bin/bash
## mytest_at_script
## The script to be run later
echo "$(date) - is when this ran" >> /home/bigbird/log/at.log

Я создал оба сценария в текстовом редакторе, сохранил их и затем сделал их каждым исполняемым использованием chmod 700 script-file-name. Я поместил их обоих в мой $HOME/bin каталог для удобства, но они могли быть где угодно моим пользователем, имеет полный доступ. Я использую 700 для любого сценария это только для тестирования, но в системе отдельного пользователя, это могло точно также быть 755.

Мне уже назвали каталог /home/bigbird/log сохранить вывод от mytest_at_script. Это может также быть где угодно Вашим пользователем, имеет полный доступ. Просто удостоверьтесь, что это существует перед выполнениями сценария, или имейте сценарий, создают его.

Для выполнения его я просто удостоверился время для at команда в mytest_at_run был немного в будущем и затем выполнил его от терминала. Я затем ожидал, пока это не выполнило и исследовало содержание $HOME/log/at.log.

bigbird@sananda:~/bin$ cat ~/log/at.log
Fri Sep 14 00:52:18 EDT 2018 - is when this ran
Fri Sep 14 00:56:00 EDT 2018 - is when this ran
bigbird@sananda:~/bin$

Несколько примечаний:

Даже при том, что я работаю at от моего пользователя это не знает мою среду, такую как мой PATH и мой корневой каталог, таким образом, я не принимаю это. Я использую полные пути как, я был бы для любого cron задание. И если я когда-нибудь хочу сделать это a cron задание, я не должен буду изменять ничего только, чтобы заставить его работать.

Я использовал >> в mytest_at_script добавлять вывод к файлу журнала вместо > который заменил бы его на каждом выполнении. Используйте, какой бы ни каждый удовлетворяет Вашему приложению лучше всего.

2
27.01.2020, 19:49

Я использую 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" появится в вашем терминале ...

5
27.01.2020, 19:49

Теги

Похожие вопросы