Навіщо нам потрібна команда "at" в Linux?


38

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

Отже, моє перше питання: чому atвикористовується команда? За яких обставин потрібно використовувати at? Я стикався з цим, коли був якийсь код скрипту bash, який намагався видалити програмне забезпечення, і коли деякі фонові послуги мали бути перезапущені.

Моє друге питання: Яка різниця між тим, що будь-яка команда виконується як пакетне завдання і команда, що виконується в команді виклику безпосередньо (або в підрозділі)?

Відповіді:


47

Відповідь Бернарда правильна: у системах, що користуються багатьма користувачами, можливість виконання важких програм у деякі нечестиві години ночі є особливо зручним як для людини, яка подає роботу, так і його співробітників. Це частина "гарно грати".

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

Я використовував ту саму команду, щоб перевірити, чи працює моя програма, і при необхідності перезапустити її.

Крім того , слід мати на увазі , що на було написано до того, як екран, tmux , і так далі, так що це був простий спосіб мати стоїть окремо оболонку, тобто один , який не помер би , як тільки ви вийшли з системи в систему.

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


15
Також варто зазначити, що ще одна відмінність у відношенні cron полягає в тому, що atзберігає ваше середовище таким, яким воно було, коли було заплановано завдання: той же робочий каталог, змінні середовища, ...
Carlos Campderrós

10
Є також batch, що майже ідентично at, але натомість буде чекати низького навантаження, і, мабуть, at -q zсподобається робота сама по собі, тоді як at -q Zбуде чекати часу, потім чекати, коли завантаження впаде, і приємної роботи. Нічого собі, яке навантаження рідко використовуваних функцій!
Ульріх Шварц

16

Я використовую atкоманду, коли мені потрібно зробити важку обробку даних, яку я хочу виконати протягом ночі, коли я не за моїм комп’ютером. Звичайно, я міг би розпочати процес відразу після відходу, але це те, що я, як правило, забуваю.

Результат команди не відрізняється від регулярного виконання сценарію або команди.


15

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

Що це робить

уривок з сторінки man

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завдання може бути визначений різними способами.

форма витягу на сторінці man

At дозволяє досить складні технічні характеристики, що розширюють стандарт POSIX.2. Він приймає часи форми HH: MM для виконання завдання в певний час доби. (Якщо цей час уже минув, передбачається наступний день.) Ви також можете вказати опівночі, полудень або час чаю (16:00), і ви можете мати час суфікса з AM або PM для запуску вранці. або вечір. Ви також можете сказати, у який день буде виконуватися завдання, вказавши дату у формі імені місяця-імені з необов'язковим роком або вказавши дату форми MMDD [CC] YY, MM / DD / [CC] YY, DD.MM. [CC] YY або [CC] YY-MM-DD. Специфікація дати повинна відповідати специфікації часу доби. Ви також можете дати час, як зараз + порахувати одиниці часу, де одиниці часу можуть бути хвилини, години, дні,

Приклади

Скажімо, у вас є цей скрипт оболонки.

$ 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сторінки.
Хашим

@Hashim - 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

Ваш адміністратор мережі повідомляє вас, що деяке обслуговування ваших веб-серверів відбуватиметься о 19:00 і закінчується о 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.