Зачем нам нужна команда «at» в Linux?


38

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

Итак, мой первый вопрос: почему используется atкоманда? При каких обстоятельствах нужно использовать at? Я сталкивался с этим, когда был некоторый код сценария bash, пытающийся удалить программное обеспечение, и когда некоторые фоновые службы должны были быть перезапущены.

Мой второй вопрос: в чем разница между выполнением какой-либо команды как пакетного задания и выполнением команды в вызове команды напрямую (или в подоболочке)?

Ответы:


47

Ответ Бернхарда верен: в многопользовательских системах способность выполнять тяжелые программы в некоторые безбожные часы ночи особенно удобна как для человека, отправляющего работу, так и для его коллег. Это часть «хорошей игры».

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

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

Кроме того, вы должны иметь в виду, что at был написан задолго до screen, tmux и т. Д., Так что это был простой способ иметь отдельную оболочку, то есть такую, которая не погибнет, когда вы выйдете из системы.

Наконец, вы также должны заметить, что он отличается от cron, который также существует уже давно. Разница заключается в том, что at является случайным, в то время как cron, будучи настолько повторяющимся, больше подходит для системных заданий, которые действительно должны выполняться вечно с фиксированными интервалами: фактически, at дает вам собственную среду с вашими собственными настройками ( и выбор) переменной окружения, в то время как cron использует минимальный набор переменных окружения (просто проверьте разницу в PATH , например).


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

10
Есть также batch, который почти идентичен at, но вместо этого будет ожидать низкой нагрузки и, по-видимому, at -q zбудет приятно выполнять свою работу сам, тогда как at -q Zбудет ждать времени, затем ждать, пока нагрузка не упадет, и приятной работы. Вау, что за куча редко используемых функций!
Ульрих Шварц

16

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

Результат выполнения команды не отличается от регулярного выполнения сценария или команды.


15

Если у вас есть такие вопросы, всегда обращайтесь к справочным страницам. Они могут быть очень поучительными.

Что оно делает

выдержка из справочной страницы

NAME
       at, batch, atq, atrm - queue, examine or delete jobs for later execution

DESCRIPTION
       at  and  batch  read  commands  from  standard  input or a specified file
       which are to be executed at a later time, using /bin/sh.

использование

Использование инструментов:

Usage: at [-V] [-q x] [-f file] [-mldbv] timespec ...
       at [-V] [-q x] [-f file] [-mldbv] -t time
       at -c job ...
       atq [-V] [-q x]
       atrm [-V] job ...
       batch

atвключает 4 команды ( at, atq, atrmи batch). Вы используете atи batchдля планирования заданий, atqчтобы увидеть, что запланировано, и atrmудалить задание до его запуска.

$ at -f <cmd> timspec

TimeSpec

Время выполнения atзадания может быть указано по-разному.

Форма выдержки на странице руководства

Ат позволяет довольно сложные временные спецификации, расширяя стандарт POSIX.2. Он принимает время в формате ЧЧ: ММ для запуска задания в определенное время дня. (Если это время уже прошло, предполагается следующий день.) Вы также можете указать полдень, полдень или чаепитие (16:00), и вы можете иметь суффикс времени дня с AM или PM для пробежки по утрам. или вечером. Вы также можете указать, в какой день будет выполняться задание, указав дату в форме имени месяца с указанием необязательного года или указав дату в форме MMDD [CC] YY, MM / DD / [CC] YY, ДД.ММ. [СС] ГГ или [СС] ГГ-ММ-ДД. Указание даты должно соответствовать указанию времени суток. Вы также можете указать время как сейчас + считать единицы времени, где единицами времени могут быть минуты, часы, дни,

Примеры

Скажем, у вас есть этот сценарий оболочки.

$ cat mycrontest.sh

#!/bin/bash
 echo "It is now $(date +%T) on $(date +%A)"

Образец прогона:

$ ./mycrontest.sh
It is now 18:37:42 on Friday

Образец при приеме на работу:

$ at -f mycrontest.sh  10pm tomorrow
job 14 at Sun Jul  8 22:00:00 2007

$ at -f mycrontest.sh 2:00 tuesday
job 15 at Tue Jul 10 02:00:00 2007

$ at -f mycrontest.sh 2:00 july 11
job 16 at Wed Jul 11 02:00:00 2007

$ at -f mycrontest.sh 2:00 next week
job 17 at Sat Jul 14 02:00:00 2007

Ссылки


Кажется, у меня есть совсем другая версия, atдоступная в моей установке Cygwin - она ​​не связана с batchкакой-либо краткой опцией, вообще не поддерживается, нет тихой опции и нет manили infoстраницы включены.
Хашим

@ Хашим - Cygwin - это его собственный зверь.
SLM

6

Вы можете выполнять пакетные задания в UNIX / Linux, используя любую из трех команд - at, batch или cron.

Расписание на работу, используя конкретную дату и время

Syntax:

    $ at time date
For example, to schedule a job at 11 am on May 20, use the following at command.

    $ at 11 am may 20

Да, у меня есть понимание "в" и его использования. Другие люди ответили на это более актуально.
Акшай Патил

5

Ваш сетевой администратор сообщает вам, что с вашими веб-серверами начнутся некоторые работы по обслуживанию, начиная с 7 вечера и заканчивая к 2 часам ночи. Вы хотите отправить уведомление о техническом обслуживании заранее и хотите, чтобы ваша система работала максимально долго. Собираетесь ли вы не спать всю ночь, готовые выполнить различные команды, а затем запустить его снова позже? Нет, вы хотите использовать atдля планирования этих задач, а затем пойти спать / играть в Skyrim и забыть об этом.


1

atтакже может быть очень удобным способом вывести напоминания. Моя текущая машина разработки работает под управлением OSX, atи простое, notify.bashчто я собрал вместе, может быть очень полезным:

$ at 5pm
notify.bash -t 'Work is over' -m "Don't forget to rollback INT environment"
^D
$ at now + 15 minutes
notify.bash -m 'Check tests' -l 'http://integration.example.com/jobs/XXXX'
^D
$ at now + 10 minutes
notify.bash -m 'Check the fridge, pudding should be done!'
^D

notify.bash

#!/bin/bash

DEFAULT_TITLE='Hey! Listen!'
TITLE="$DEFAULT_TITLE"
LINK=
MESSAGE=

function args.help () {
    local error="$1"
    if [ "$error" ]; then
        echo >&2 "$error"
    fi
    cat >&2 <<EOF
Usage $0 <options>

Displays a message using an Applescript notification box

Options
-------

--title <text>    Sets the title, otherwise the default is used ("$DEFAULT_TITLE")
 -t     <text>    Alias for --title

--link  <url>     Add a button to open a link
 -l     <url>     Alias for --link

--body  <text>    Set the message body
 -m     <text>    Alias for --body
EOF
}

function args.verify-not-empty () {
    local value="$1"
    local varname="$2"

    if [ "$value" ]; then
        echo "$value"
    elif [ "$varname" ]; then
        args.help "$varname cannot handle an empty argument"
        exit 1
    else
        args.help \
            "The programmer forgot to include context, something was empty which shouldn't have been, but I can't tell you much more than that. Sorry :("
        exit 1
    fi
}

function args.parse () {
    while [ "$1" ]
    do
        case "$1" in
            '-t' | '--title')
                shift
                TITLE=$(args.verify-not-empty "$1" title)
                shift
                ;;
            '-l' | '--link')
                shift
                LINK=$(args.verify-not-empty "$1" link)
                shift
                ;;
            '-m' | '--body')
                shift
                if [[ "$1" = '-' ]]; then
                    MESSAGE=$(cat -)
                else
                    MESSAGE="$1"
                fi
                MESSAGE=$(args.verify-not-empty "$MESSAGE" body)
                shift
                ;;
            *)
                args.help "Unrecognized argument: $1"
                exit 1
        esac
    done
    if [[ ! "$MESSAGE" ]]; then
        args.help "Message body was not specified"
        exit 1
    fi
}

function message.display-no-link () {
    osascript > /dev/null <<EOF
tell application "Finder"
  activate
  display alert "$TITLE" ¬
          message "$MESSAGE" ¬
          buttons { "Acknowledge" } ¬
          default button "Acknowledge"
end tell
return
EOF
}

function message.display-with-link () {
    osascript > /dev/null <<EOF
tell application "Finder"
  activate
  display alert "$TITLE" ¬
          message "$MESSAGE\n\nClick 'Open Link' to go to $LINK" ¬
          buttons { "Acknowledge", "Open Link" } ¬
          default button "Open Link"
          set response to button returned of the result
          if response is "Open Link" then open location "$LINK"
end tell
return
EOF
}

function message.display () {
    if [ "$LINK" ]; then
        message.display-with-link
    else
        message.display-no-link
    fi
}

args.parse "$@"
message.display
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.