¿Por qué necesitamos el comando "at" en Linux?

38

Estaba estudiando el código en el que atse usa el comando. Miré a mi alrededor y descubrí que se usa para ejecutar trabajos por lotes. Se utiliza para programar trabajos. Se le da, como entrada, un comando y un tiempo, relativo o absoluto.

Entonces, mi primera pregunta es: ¿por qué se atusa el comando? ¿En qué circunstancias hay que usar at? Lo encontré cuando había algún código de script bash que intentaba desinstalar software y cuando algunos servicios en segundo plano debían reiniciarse.

Mi segunda pregunta: ¿Cuál es la diferencia entre tener un comando ejecutado como un trabajo por lotes y tener un comando ejecutado al llamar al comando directamente (o en el subshell)?

Akshay Patil
fuente

Respuestas:

47

La respuesta de Bernhard es correcta: en sistemas multiusuario, la capacidad de ejecutar programas pesados ​​en algunas horas impías de la noche es especialmente conveniente, tanto para la persona que presenta el trabajo como para sus compañeros de trabajo. Es parte de "jugar bien".

Hice la mayor parte de mi doctorado. cálculos de esta manera, combinando el script con el comando agradable que degradaba la prioridad de mi trabajo cuando otras personas mantenían la máquina ocupada, mientras dejaba intacta su capacidad de acaparar todos los recursos del sistema por la noche.

Utilicé el mismo comando para verificar si mi programa se estaba ejecutando y reiniciarlo si fuera necesario.

Además, debe tener en cuenta que en fue escrito mucho antes de pantalla, tmux , y así sucesivamente, de modo que era una forma sencilla de tener una cáscara individual, es decir, uno que no moriría una vez que se cierra la sesión del sistema.

Por último, también debe notar que es diferente de cron, que también ha existido durante mucho tiempo. Las mentiras diferencia en el hecho de que al decir de vez en cuando, mientras que cron, al ser tan repetitivo, es más adecuado para los trabajos del sistema, que realmente necesitan para ser ejecutado por siempre a intervalos fijos: de hecho, al que le da a su propio entorno, con su propia configuración ( y opciones) de la variable de entorno, mientras que cron usa un conjunto mínimo de variables de entorno (solo verifique la diferencia en PATH , como ejemplo).

MariusMatutiae
fuente
15
También vale la pena señalar como otra diferencia con cron, es que atconserva su entorno tal como estaba cuando se programó el trabajo: el mismo directorio de trabajo, variables de entorno, ...
Carlos Campderrós
10
También hay batch, que es casi idéntico at, pero esperará una carga baja en su lugar, y aparentemente, at -q zhará el trabajo por sí mismo, mientras at -q Zque esperará el tiempo, luego esperará a que la carga caiga, y también hará el trabajo. ¡Vaya, qué cantidad de funciones rara vez se usan!
Ulrich Schwarz
16

Uso el atcomando cuando necesito hacer un procesamiento pesado en los datos, que quiero haber ejecutado durante la noche, cuando no estoy detrás de mi computadora. Por supuesto, podría comenzar el proceso justo después de irme, pero esto es algo que tiendo a olvidar.

El resultado del comando no es diferente de la ejecución regular del script o comando.

Bernhard
fuente
15

Cuando tenga preguntas como esta, consulte siempre las páginas de manual. Pueden ser muy esclarecedores.

Que hace

extracto de la página 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

El uso de las herramientas:

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

atincluye 4 comandos ( at, atq, atrm, y batch). Utiliza aty batchpara programar los trabajos, atqpara ver qué está programado y atrmpara eliminar un trabajo antes de que se ejecute.

$ at -f <cmd> timspec

Timespec

El tiempo para ejecutar el attrabajo se puede especificar de diferentes maneras.

formulario de extracto en la página del manual

At permite especificaciones de tiempo bastante complejas, extendiendo el estándar POSIX.2. Acepta tiempos de la forma HH: MM para ejecutar un trabajo a una hora específica del día. (Si esa hora ya ha pasado, se supone el día siguiente). También puede especificar la medianoche, el mediodía o la hora del té (4 p.m.) y puede tener un sufijo de hora del día con AM o PM para correr en la mañana o la tarde. También puede decir en qué día se ejecutará el trabajo, dando una fecha en el formulario mes-día con un año opcional, o dando una fecha del formulario MMDD [CC] AA, MM / DD / [CC] AA, DD.MM. [CC] YY o [CC] YY-MM-DD. La especificación de una fecha debe seguir la especificación de la hora del día. También puede dar tiempos como ahora + contar unidades de tiempo, donde las unidades de tiempo pueden ser minutos, horas, días,

Ejemplos

Digamos que tienes este script de shell.

$ cat mycrontest.sh

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

Ejecución de muestra:

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

Muestra en las entregas de trabajo:

$ 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

Referencias

slm
fuente
Me parece que tienen una versión muy diferente de la atdisponible en mi instalación de Cygwin - que no parece estar ligado a batch, no son compatibles con las opciones cortas en absoluto, no hay ninguna opción tranquila, y no hay mano infose incluyen páginas.
Hashim
@Hashim: Cygwin es su propia bestia.
slm
6

Puede ejecutar trabajos por lotes en UNIX / Linux utilizando cualquiera de los tres comandos: at, batch o cron.

Programe un trabajo en una fecha y hora específicas

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
fuente
Sí, entiendo "at" y su uso. Otras personas lo han respondido de manera más relevante.
Akshay Patil
5

El administrador de su red le informa que se realizarán algunos trabajos de mantenimiento en sus servidores web a partir de las 7 p.m. y terminando a las 2 a.m. Desea enviar una notificación de mantenimiento de antemano y desea el máximo tiempo de actividad de su sistema. ¿Vas a quedarte despierto toda la noche, listo para ejecutar varios comandos y luego volver a iniciarlo más tarde? No, querrás usarlo atpara programar estas tareas, luego ve a la cama / juega skyrim y olvídate de eso.

Deja de dañar a Monica
fuente
1

atTambién puede ser una forma muy útil de disparar recordatorios. Mi máquina de desarrollo actual está ejecutando OSX, por atlo notify.bashque lo simple que improvisé puede ser realmente útil:

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