it-swarm.com.de

Warum brauchen wir den Befehl "at" unter Linux?

Ich habe Code studiert, in dem der Befehl at verwendet wird. Ich habe mich umgesehen und festgestellt, dass damit Stapeljobs ausgeführt werden. Es wird verwendet, um Jobs zu planen. Es gibt als Eingabe einen Befehl und eine Zeit, relativ oder absolut.

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

Meine zweite Frage: Was ist der Unterschied zwischen der Ausführung eines Befehls als Stapeljob und der Ausführung eines Befehls beim direkten Aufrufen eines Befehls (oder in einer Subshell)?

39
Akshay Patil

Bernhards Antwort ist richtig: In Mehrbenutzersystemen ist die Fähigkeit, schwere Programme zu einigen gottlosen Stunden der Nacht auszuführen, sowohl für die Person, die den Auftrag einreicht, als auch für ihre Mitarbeiter besonders praktisch. Es ist Teil von "Nizza spielen".

Ich habe den größten Teil meiner Promotion gemacht. Berechnungen auf diese Weise, wobei das Skript mit dem Befehl Nice kombiniert wird, der die Priorität meiner Arbeit herabsetzt, wenn andere Leute die Maschine beschäftigen, während ihre Fähigkeit, alle Systemressourcen nachts zu belasten, intakt bleibt.

Ich habe denselben Befehl verwendet, um zu überprüfen, ob mein Programm ausgeführt wurde, und um es bei Bedarf neu zu starten.

Beachten Sie auch, dass at bereits vor screen, tmux usw. geschrieben wurde, sodass es eine einfache Möglichkeit war, eine getrennte Shell zu haben, d. H. eine, die nicht sterben würde, wenn Sie sich vom System abgemeldet haben.

Schließlich sollten Sie auch bemerken, dass es sich von Cron unterscheidet, das es auch schon lange gibt. Der Unterschied liegt in der Tatsache, dass at gelegentlich vorkommt, während cron, da es sich so wiederholt, eher für Systemjobs geeignet ist, die wirklich für immer in festgelegten Intervallen ausgeführt werden müssen: Tatsächlich gibt at Ihnen Ihre eigenen Umgebung mit Ihren eigenen Einstellungen (und Auswahlmöglichkeiten) für Umgebungsvariablen, während cron einen minimalen Satz von Umgebungsvariablen verwendet (überprüfen Sie einfach den Unterschied in [~ # ~] Pfad [~ # ~) ] als Beispiel).

48
MariusMatutiae

Ich verwende den Befehl at, wenn ich eine umfangreiche Verarbeitung von Daten durchführen muss, die ich nachts ausführen möchte, wenn ich mich nicht hinter meinem Computer befinde. Natürlich könnte ich den Prozess gleich nach meiner Abreise starten, aber das vergesse ich oft.

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

16
Bernhard

Wenn Sie Fragen wie diese haben, 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.

Verwendungszweck

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

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

$ at -f <cmd> timspec

Timespec

Die Zeit zum Ausführen des Jobs at kann auf verschiedene Arten angegeben werden.

Auszugsformular auf der Manpage

At ermöglicht ziemlich komplexe Zeitspezifikationen 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 eine Tageszeit mit dem Zusatz AM oder PM für das Ausführen am Morgen oder am Abend. Sie können auch angeben, an welchem ​​Tag der Job ausgeführt wird, indem Sie ein Datum im Formular Monatsname Tag mit einem optionalen Jahr oder ein Datum des Formulars MMDD [angeben. CC] JJ, MM/TT/[CC] JJ, TT.MM. [CC] JJ oder [CC] JJ-MM-TT. Die Angabe eines Datums muss der Angabe der Tageszeit entsprechen. Sie können auch angeben Zeiten wie jetzt + Zähle Zeiteinheiten, wobei die Zeiteinheiten Minuten, Stunden, Tage oder Wochen sein können und du erkennen kannst, ob der Job heute ausgeführt werden soll, indem die Zeit mit heute und der Job morgen ausgeführt wird, indem die Zeit angehängt wird mit morgen.

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

Beispiel bei Jobeinreichungen:

$ 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

15
slm

Ihr Netzwerkadministrator informiert Sie darüber, dass Ihre Webserver ab 19 Uhr und bis 2 Uhr morgens gewartet werden. Sie möchten vorab eine Wartungsbenachrichtigung bereitstellen und möchten eine maximale Verfügbarkeit Ihres Systems. Bleiben Sie die ganze Nacht wach, können verschiedene Befehle ausführen und später erneut starten? Nein, Sie möchten at verwenden, um diese Aufgaben zu planen, dann ins Bett gehen/Skyrim spielen und es vergessen.

6
OrangeDog

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

Planen Sie einen Auftrag 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
6
Roshan Bagdiya

at kann auch eine sehr praktische Möglichkeit sein, Erinnerungen auszulösen. Auf meiner aktuellen Entwicklungsmaschine läuft OSX, also at und das einfache notify.bash dass ich zusammengeschustert habe 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 "[email protected]"
message.display
1
Morgen