Dlaczego potrzebujemy polecenia „at” w systemie Linux?

38

Studiowałem kod, w którym atużywane jest polecenie. Rozejrzałem się i odkryłem, że służy on do wykonywania zadań wsadowych. Służy do planowania zadań. Jako dane wejściowe podano polecenie i czas względny lub bezwzględny.

Moje pierwsze pytanie brzmi: dlaczego atużywane jest polecenie? W jakich okolicznościach należy użyć at? Zetknąłem się z nim, gdy jakiś kod skryptu bash próbował odinstalować oprogramowanie i kiedy niektóre usługi w tle miały zostać zrestartowane.

Moje drugie pytanie: Jaka jest różnica między wykonaniem dowolnego polecenia jako zadania wsadowego a wykonaniem polecenia w bezpośrednim wywołaniu polecenia (lub w podpowłoce)?

Akshay Patil
źródło

Odpowiedzi:

47

Odpowiedź Bernharda jest poprawna: w systemach wieloużytkownikowych możliwość wykonywania ciężkich programów w niektóre bezbożne godziny w nocy jest szczególnie wygodna zarówno dla osoby składającej zlecenie, jak i dla jego współpracowników. Jest to część „przyjemnego grania”.

Zrobiłem większość mojego doktoratu. obliczenia w ten sposób, łącząc skrypt z przyjemnym poleceniem, które obniżało priorytet mojej pracy, ilekroć inni ludzie utrzymywali maszynę w ruchu, pozostawiając nienaruszoną zdolność do zatrzymywania wszystkich zasobów systemowych w nocy.

Użyłem tego samego polecenia, aby sprawdzić, czy mój program działa, i w razie potrzeby zrestartować go.

Należy również pamiętać, że at został napisany na długo przed screenem, tmuxem itd., Aby był to prosty sposób na posiadanie odłączonej powłoki, tj. Takiej , która nie umarłaby po wylogowaniu z systemu.

Na koniec powinieneś również zauważyć, że różni się od crona, który również istnieje od dłuższego czasu. Kłamstwa różnica w tym, że co jest sporadyczne, a cron, będąc tak powtarzalne, jest bardziej odpowiedni dla zadań systemowych, które naprawdę muszą być wykonywane zawsze w ustalonych odstępach czasu: w rzeczywistości, co daje własnego środowiska, z własnych ustawień ( i wybory) zmiennej środowiskowej, podczas gdy cron używa minimalnego zestawu zmiennych środowiskowych (wystarczy na przykład sprawdzić różnicę w PATH ).

MariusMatutiae
źródło
15
Warto również zwrócić uwagę na kolejną różnicę w stosunku do crona, ponieważ atzachowuje ono środowisko tak, jak było podczas planowania zadania: ten sam katalog roboczy, zmienne środowiskowe, ...
Carlos Campderrós
10
Jest też batch, co jest prawie identyczne at, ale zamiast tego zaczeka na niski ładunek i najwyraźniej at -q zsam sobie poradzi, podczas gdy at -q Zbędzie czekał na czas, a następnie poczeka na opadnięcie ładunku, a także ładną pracę. Wow, co za zestaw rzadko używanych funkcji!
Ulrich Schwarz
16

Korzystam z atpolecenia, gdy muszę wykonać intensywne przetwarzanie danych, które chcę wykonać w nocy, gdy nie jestem za komputerem. Oczywiście mógłbym rozpocząć proces zaraz po moim odejściu, ale o tym często zapominam.

Wynik polecenia nie różni się od regularnego wykonywania skryptu lub polecenia.

Bernhard
źródło
15

Gdy masz takie pytania, zawsze czytaj strony podręcznika. Mogą być bardzo pouczające.

Co to robi

fragment strony 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.

Stosowanie

Korzystanie z narzędzi:

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

atzawiera 4 polecenia ( at, atq, atrmi batch). Korzystasz z ati batchdo planowania zadań, atqaby zobaczyć, co jest zaplanowane, i atrmdo usunięcia zadania przed jego uruchomieniem.

$ at -f <cmd> timspec

Specjalizacja czasowa

Czas uruchomienia atzadania można określić na różne sposoby.

formularz fragmentu na stronie podręcznika

At pozwala na dość złożone specyfikacje czasu, rozszerzając standard POSIX.2. Przyjmuje godziny w formacie GG: MM, aby uruchomić zadanie o określonej porze dnia. (Jeśli ten czas już minął, zakłada się następny dzień.) Możesz także określić noc, południe lub teatime (16:00), a rano możesz ustawić sufiks AM lub PM na bieganie rano lub wieczór. Możesz także powiedzieć, w jaki dzień zadanie będzie uruchamiane, podając datę w formie miesiąca-imienia z opcjonalnym rokiem lub podając datę w formacie MMDD [CC] RR, MM / DD / [CC] RR, DD.MM. [CC] YY lub [CC] YY-MM-DD. Określenie daty musi być zgodne ze wskazaniem pory dnia. Możesz także podać czasy takie jak teraz + zliczanie jednostek czasu, gdzie jednostkami czasu mogą być minuty, godziny, dni,

Przykłady

Powiedz, że masz ten skrypt powłoki.

$ cat mycrontest.sh

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

Przykładowy przebieg:

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

Próbka przy zgłoszeniach pracy:

$ 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

Referencje

slm
źródło
I zdają się mieć bardzo różne wersje atdostępne na mojej instalacji Cygwin - nie wydaje się związana batch, nie ma krótkie opcje są obsługiwane w ogóle, nie ma opcji, ciche, a nie manczy infostrony są włączone.
Hashim
@Hashim - cygwin jest jego własną bestią.
slm
6

Możesz wykonywać zadania wsadowe w systemie UNIX / Linux za pomocą jednego z trzech poleceń - at, batch lub cron.

Zaplanuj pracę przy użyciu określonej daty i godziny

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
Roshan Bagdiya
źródło
Tak, rozumiem „at” i jego użycie. Inne osoby odpowiedziały na to bardziej trafnie.
Akshay Patil
5

Administrator sieci informuje, że na serwerach internetowych zostaną przeprowadzone pewne czynności konserwacyjne od godziny 19:00 do 2:00. Chcesz wcześniej przesłać powiadomienie o konserwacji i uzyskać maksymalny czas pracy bez przestojów. Czy zamierzasz pozostać przez całą noc, gotowy do uruchamiania różnych poleceń, a następnie uruchomić go ponownie później? Nie, chciałbyś użyć, ataby zaplanować te zadania, a następnie pójść spać / pograć w skyrim i zapomnieć o tym.

Przestań krzywdzić Monikę
źródło
1

atmoże być również bardzo przydatnym sposobem na wysyłanie przypomnień. Na mojej obecnej maszynie deweloperskiej działa OSX, więc atproste, notify.bashktóre udało mi się zebrać, może być naprawdę pomocne:

$ 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
Morgen
źródło