Perché abbiamo bisogno del comando "at" in Linux?


38

Stavo studiando il codice in cui atviene utilizzato il comando. Mi sono guardato intorno e ho scoperto che è usato per eseguire lavori batch. Viene utilizzato per pianificare i lavori. Viene dato, come input, un comando e un tempo, relativo o assoluto.

Quindi, la mia prima domanda è: perché viene atutilizzato il comando? In quali circostanze è necessario utilizzare at? L'ho riscontrato quando c'era del codice script bash che cercava di disinstallare il software e quando alcuni servizi in background dovevano essere riavviati.

La mia seconda domanda: qual è la differenza tra l'esecuzione di qualsiasi comando come processo batch e l'esecuzione di un comando nel chiamare direttamente il comando (o nella sottoshell)?

Risposte:


47

La risposta di Bernhard è corretta: nei sistemi multiutente, la capacità di eseguire programmi pesanti in alcune ore empie della notte è particolarmente conveniente, sia per la persona che presenta il lavoro, sia per i suoi colleghi. Fa parte del "suonare bene".

Ho fatto la maggior parte del mio dottorato di ricerca. calcoli in questo modo, combinando la sceneggiatura con il simpatico comando che declassava la priorità del mio lavoro ogni volta che altre persone tenevano occupata la macchina, lasciando intatta la sua capacità di afferrare tutte le risorse del sistema di notte.

Ho usato lo stesso comando per verificare se il mio programma era in esecuzione e, se necessario, per riavviarlo.

Inoltre, dovresti tenere presente che at è stato scritto molto prima di screen, tmux e così via, in modo che fosse un modo semplice per avere una shell staccata, cioè uno che non sarebbe morto una volta disconnesso dal sistema.

Infine, dovresti anche notare che è diverso da cron, che è in circolazione da molto tempo. Le bugie differenza nel fatto che a è occasionale, mentre cron, essendo così ripetitivo, è più adatto per i lavori di sistema che in realtà devono essere eseguite sempre a intervalli fissi: infatti, a ti dà il proprio ambiente, con le proprie impostazioni ( e scelte) della variabile d'ambiente, mentre cron usa un set minimo di variabili d'ambiente (basta controllare la differenza in PERCORSO , come esempio).


15
Vale anche la pena sottolineare che un'altra differenza con cron, è che atmantiene il tuo ambiente com'era quando il lavoro era programmato: stessa directory di lavoro, variabili di ambiente, ...
Carlos Campderrós,

10
C'è anche batch, che è quasi identico a at, ma aspetterà invece un carico basso, e apparentemente, at -q zfarà il lavoro da solo, mentre at -q Zaspetterà il tempo, quindi aspetterà che il carico scenda e anche il lavoro. Wow, che carico di funzionalità usate di rado!
Ulrich Schwarz,

16

Uso il atcomando quando devo eseguire pesanti elaborazioni sui dati, che voglio aver eseguito durante la notte, quando non sono dietro al mio computer. Ovviamente potrei iniziare il processo subito dopo che me ne vado, ma è qualcosa che tendo a dimenticare.

Il risultato del comando non è diverso dall'esecuzione regolare dello script o del comando.


15

Quando hai domande come questa consulta sempre le pagine man. Possono essere molto illuminanti.

Cosa fa

estratto dalla pagina 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.

uso

L'uso degli strumenti:

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

atcomprende 4 comandi ( at, atq, atrme batch). Si utilizza ate batchper pianificare i lavori, atqper vedere cosa è programmato e atrmper rimuovere un lavoro prima che venga eseguito.

$ at -f <cmd> timspec

timespec

Il tempo per eseguire il atlavoro può essere specificato in diversi modi.

modulo estratto nella pagina man

A consente specifiche temporali piuttosto complesse, estendendo lo standard POSIX.2. Accetta i tempi del modulo HH: MM per eseguire un lavoro a una determinata ora del giorno. (Se quell'ora è già passata, si presume il giorno successivo.) Puoi anche specificare mezzogiorno, mezzogiorno o ora del tè (16:00) e puoi avere un ora del giorno suffissato con AM o PM per correre al mattino o la sera. Puoi anche dire in quale giorno verrà eseguito il lavoro, specificando una data nel modulo mese-onomastico con un anno facoltativo o specificando una data del modulo MMDD [CC] YY, MM / DD / [CC] YY, GG.MM. [CC] AA o [CC] AA-MM-GG. La specifica di una data deve seguire la specifica dell'ora del giorno. Puoi anche dare tempi come ora + contare le unità di tempo, dove le unità di tempo possono essere minuti, ore, giorni,

Esempi

Supponi di avere questo script di shell.

$ cat mycrontest.sh

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

Esecuzione di esempio:

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

Campione alle domande di lavoro:

$ 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

Riferimenti


Mi sembra di avere una versione molto diversa di atdisponibile sulla mia installazione di Cygwin - non sembra collegata batch, non sono supportate opzioni brevi, non esiste un'opzione silenziosa e nessuna mano infopagine sono incluse.
Hashim,

@Hashim - cygwin è la sua bestia.
slm

6

È possibile eseguire lavori batch in UNIX / Linux utilizzando uno dei tre comandi: at, batch o cron.

Pianifica un lavoro utilizzando data e ora specifiche

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

Sì, ho quella comprensione di "at" e del suo utilizzo. Altre persone hanno risposto in modo più pertinente.
Akshay Patil,

5

L'amministratore di rete ti informa che alcuni server manterranno la manutenzione a partire dalle 19:00 e finendo entro le 02:00. Desideri inviare in anticipo una notifica di manutenzione e desideri il massimo tempo di attività dal tuo sistema. Rimarrai sveglio tutta la notte, pronto per eseguire vari comandi e riavviarlo più tardi? No, ti consigliamo atdi pianificare queste attività, quindi vai a letto / gioca a skyrim e dimenticalo.


1

atpuò anche essere un modo davvero utile per attivare i promemoria. La mia attuale macchina di sviluppo sta eseguendo OSX, quindi ate il semplice notify.bashche ho messo insieme può essere davvero utile:

$ 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.