Warum brauchen wir den Befehl "at" in Linux?

38

Ich habe Code studiert, in dem der atBefehl verwendet wird. Ich habe mich umgesehen und festgestellt, dass es zum Ausführen von Batch-Jobs verwendet wird. Es wird verwendet, um Jobs zu planen. Als Eingabe wird ein Befehl und eine relative oder absolute Zeit gegeben.

Meine erste Frage lautet also: Warum wird der atBefehl verwendet? Unter welchen Umständen muss man verwenden at? Ich bin darauf gestoßen, als ein Bash-Skriptcode versuchte, Software zu deinstallieren, und als einige Hintergrunddienste neu gestartet werden sollten.

Meine zweite Frage: Was ist der Unterschied zwischen der Ausführung eines Befehls als Batch-Job und der Ausführung eines Befehls im direkten Aufruf eines Befehls (oder in einer Subshell)?

Akshay Patil
quelle

Antworten:

47

Die Antwort von Bernhard ist richtig: In Mehrbenutzersystemen ist es sowohl für den Auftraggeber als auch für seine Mitarbeiter besonders praktisch, schwere Programme zu einigen gottlosen Stunden der Nacht auszuführen. Es ist Teil von "schön spielen".

Ich habe die meiste Zeit meines Ph.D. Berechnungen auf diese Weise, wobei das Skript mit dem netten Befehl kombiniert wird, der die Priorität meiner Arbeit herabsetzt, wenn andere Leute die Maschine beschäftigt halten, während die Fähigkeit, nachts alle Systemressourcen zu belasten, intakt bleibt.

Ich habe den gleichen Befehl verwendet, um zu überprüfen, ob mein Programm ausgeführt wird, und um es gegebenenfalls neu zu starten.

Beachten Sie außerdem , dass at bereits vor screen, tmux und so weiter geschrieben wurde, sodass eine getrennte Shell auf einfache Weise erstellt werden konnte, dh eine Shell, die nicht stirbt, wenn Sie sich vom System abgemeldet haben.

Zuletzt sollten Sie auch bemerken, dass es sich um einen anderen Cron handelt, der es auch schon lange gibt. Der Unterschied liegt in der Tatsache, dass at gelegentlich, während cron sich so wiederholt, eher für Systemjobs geeignet ist, die wirklich für immer in festgelegten Intervallen ausgeführt werden müssen: Tatsächlich bietet at Ihnen Ihre eigene Umgebung mit Ihren eigenen Einstellungen ( und Auswahlmöglichkeiten) der Umgebungsvariablen, während cron einen minimalen Satz von Umgebungsvariablen verwendet (überprüfen Sie nur den Unterschied in PATH als Beispiel).

MariusMatutiae
quelle
15
Ein weiterer Unterschied zu cron besteht darin, dass atIhre Umgebung so bleibt, wie sie zum Zeitpunkt der Auftragsplanung war: dasselbe Arbeitsverzeichnis, Umgebungsvariablen, ...
Carlos Campderrós
10
Es gibt auch eine batch, die fast identisch ist at, aber stattdessen auf eine niedrige Last wartet und anscheinend at -q zden Job für sich erledigt, während at -q Zsie auf die Zeit wartet, dann auf das Absinken der Last wartet und den Job ebenfalls erledigt. Wow, was für eine Menge selten genutzter Funktionen!
Ulrich Schwarz
16

Ich benutze den atBefehl, wenn ich Daten, die ich nachts ausführen möchte, stark verarbeiten muss, wenn ich nicht hinter meinem Computer stehe. Natürlich könnte ich den Prozess gleich nach meiner Abreise beginnen, aber das ist etwas, was ich oft vergesse.

Das Ergebnis des Befehls unterscheidet sich nicht von der regelmäßigen Ausführung des Skripts oder Befehls.

Bernhard
quelle
15

Bei Fragen wie diesen konsultieren Sie immer die Manpages. Sie können sehr aufschlussreich sein.

Was es macht

Auszug aus der Manpage

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.

Verwendung

Die Verwendung der Tools:

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

at4 enthält Befehle ( at, atq, atrmund batch). Sie verwenden atund, batchum die Jobs zu planen, um atqzu sehen, was geplant ist, und atrmum einen Job zu entfernen, bevor er ausgeführt wird.

$ at -f <cmd> timspec

Zeitangabe

Die Ausführungszeit des atJobs kann auf verschiedene Arten festgelegt werden.

Auszug aus der Manpage

At ermöglicht ziemlich komplexe Zeitangaben und erweitert den POSIX.2-Standard. Es akzeptiert Zeiten der Form HH: MM, um einen Job zu einer bestimmten Tageszeit auszuführen. (Wenn diese Zeit bereits abgelaufen ist, wird der nächste Tag angenommen.) Sie können auch Mitternacht, Mittag oder Teezeit (16 Uhr) angeben und die Tageszeit mit AM oder PM versehen, um morgens zu laufen oder am Abend. Sie können auch angeben, an welchem ​​Tag der Job ausgeführt werden soll, indem Sie ein Datum im Format Monat-Name Tag mit einem optionalen Jahr oder ein Datum im Format MMTT [CC] JJ, MM / TT / [CC] JJ eingeben. TT.MM. [CC] JJ oder [CC] JJ-MM-TT. Die Angabe eines Datums muss der Angabe der Uhrzeit folgen. Sie können auch Zeiten wie jetzt angeben + Zeiteinheiten zählen, wobei die Zeiteinheiten Minuten, Stunden, Tage sein können.

Beispiele

Angenommen, Sie haben dieses Shell-Skript.

$ cat mycrontest.sh

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

Probelauf:

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

Probe bei der Auftragserteilung:

$ 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

Verweise

slm
quelle
Ich habe anscheinend eine ganz andere Version von atin meiner Cygwin-Installation - es scheint nicht mit dieser verknüpft zu sein batch, es werden überhaupt keine kurzen Optionen unterstützt, es gibt keine stillen Optionen und es sind keine manoder infoSeiten enthalten.
Hashim
@Hashim - Cygwin ist ein eigenes Biest.
slm
6

Sie können Stapeljobs unter UNIX / Linux mit einem der drei Befehle ausführen - at, batch oder cron.

Planen Sie einen at-Job mit einem bestimmten Datum und einer bestimmten Uhrzeit

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
quelle
Ja, ich verstehe "at" und seine Verwendung. Andere Leute haben es relevanter beantwortet.
Akshay Patil
5

Ihr Netzwerkadministrator informiert Sie darüber, dass einige Wartungsarbeiten an Ihren Webservern ab 19:00 Uhr bis 02:00 Uhr durchgeführt werden. Sie möchten im Voraus eine Wartungsmeldung senden und möchten eine maximale Verfügbarkeit Ihres Systems erreichen. Wirst du die ganze Nacht wach bleiben, bereit sein, verschiedene Befehle auszuführen und sie später wieder zu starten? Nein, Sie möchten atdiese Aufgaben planen, dann ins Bett gehen / Skyrim spielen und es vergessen.

Hör auf, Monica zu schaden
quelle
1

atkann auch eine sehr praktische Möglichkeit sein, Erinnerungen auszulösen. Mein aktueller Dev-Rechner läuft unter OSX, atund das einfache notify.bashZusammenschustern kann sehr hilfreich sein:

$ 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
quelle