Por que precisamos do comando "at" no Linux?

38

Eu estava estudando código no qual o atcomando é usado. Olhei em volta e descobri que ele é usado para executar tarefas em lote. É usado para agendar trabalhos. É dado, como entrada, um comando e um tempo, relativo ou absoluto.

Então, minha primeira pergunta é: por que o atcomando é usado? Sob quais circunstâncias é preciso usar at? Eu o encontrei quando havia algum código de script bash tentando desinstalar o software e quando alguns serviços em segundo plano deveriam ser reiniciados.

Minha segunda pergunta: qual é a diferença entre executar qualquer comando como um trabalho em lotes e executar um comando ao chamar o comando diretamente (ou no subshell)?

Akshay Patil
fonte

Respostas:

47

A resposta de Bernhard está correta: em sistemas multiusuários, a capacidade de executar programas pesados ​​em algumas horas ruins da noite é especialmente conveniente, tanto para a pessoa que envia o trabalho quanto para seus colegas de trabalho. Faz parte de "jogar bem".

Fiz a maior parte do meu doutorado. cálculos dessa maneira, combinando o script com o comando nice, que rebaixava a prioridade do meu trabalho sempre que outras pessoas mantinham a máquina ocupada, deixando intacta sua capacidade de consumir todos os recursos do sistema à noite.

Usei o mesmo comando para verificar se meu programa estava em execução e para reiniciá-lo, se necessário.

Além disso, você deve ter em mente que no foi escrito muito antes de tela, tmux , e assim por diante, de modo que era uma maneira simples de ter uma casca individual, ou seja, aquele que não morreria depois de desconectado do sistema.

Por fim, você também deve notar que é diferente do cron, que também existe há muito tempo. A diferença está no fato de que at é ocasional, enquanto o cron, por ser tão repetitivo, é mais adequado para tarefas do sistema que realmente precisam ser executadas para sempre em intervalos fixos: na verdade, at fornece seu próprio ambiente, com suas próprias configurações ( e escolhas) da variável de ambiente, enquanto o cron usa um conjunto mínimo de variáveis ​​de ambiente (apenas verifique a diferença no PATH , como exemplo).

MariusMatutiae
fonte
15
Também vale a pena apontar como outra diferença com cron, é que atmantém o seu ambiente do jeito que estava quando o trabalho foi agendado: mesmo diretório de trabalho, variáveis de ambiente, ...
Carlos Campderrós
10
Há também batch, que é quase idêntico at, mas, em vez disso, aguardará uma carga baixa e, aparentemente, at -q zagradará o trabalho por si só, enquanto at -q Zaguardará o tempo, aguardará a queda da carga e também agradará o trabalho. Uau, que carga de recursos raramente usados!
precisa
16

Uso o atcomando quando preciso fazer um processamento pesado de dados, que desejo executar durante a noite, quando não estou atrás do computador. É claro que eu poderia iniciar o processo logo depois de sair, mas isso é algo que costumo esquecer.

O resultado do comando não é diferente da execução regular do script ou comando.

Bernhard
fonte
15

Quando você tiver perguntas como essa, sempre consulte as páginas de manual. Eles podem ser muito esclarecedores.

O que faz

trecho de na página de manual

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

O uso das ferramentas:

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 inclui comandos ( at, atq, atrm, e batch). Você usa ate batchpara agendar os trabalhos, atqpara ver o que está agendado e atrmpara remover um trabalho antes da execução.

$ at -f <cmd> timspec

Timespec

O tempo para executar o attrabalho pode ser especificado de diferentes maneiras.

formulário de trecho na página do manual

At permite especificações de tempo bastante complexas, estendendo o padrão POSIX.2. Ele aceita horários no formato HH: MM para executar um trabalho em um horário específico do dia. (Se esse horário já passou, o dia seguinte é assumido.) Você também pode especificar a meia-noite, o meio-dia ou a hora do chá (16h) e pode ter um horário do dia com o sufixo AM ou PM para executar pela manhã ou a noite. Você também pode dizer em que dia o trabalho será executado, fornecendo uma data no formulário nome do mês dia com um ano opcional ou uma data no formato MMDD [CC] AA, MM / DD / [CC] AA, DD.MM. [CC] AA ou [CC] AA-MM-DD. A especificação de uma data deve seguir a especificação da hora do dia. Você também pode fornecer horários como agora + contar unidades de tempo, em que as unidades de tempo podem ser minutos, horas, dias,

Exemplos

Digamos que você tenha esse script de shell.

$ cat mycrontest.sh

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

Exemplo de execução:

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

Amostra em envios de trabalhos:

$ 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

Referências

slm
fonte
Eu pareço ter uma versão muito diferente da atdisponível no meu instalação Cygwin - que não parece ligada a batch, são suportados há curtas opções em tudo, não há nenhuma opção tranquila, e nenhuma manou infopáginas estão incluídos.
Hashim
@Hashim - cygwin é o seu próprio animal.
slm
6

Você pode executar tarefas em lote no UNIX / Linux usando qualquer um dos três comandos - at, batch ou cron.

Programe um trabalho usando data e 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
fonte
Sim, eu tenho esse entendimento de "at" e seu uso. Outras pessoas responderam de forma mais relevante.
Akshay Patil
5

O administrador da rede informa que algumas manutenções ocorrerão nos servidores da Web, começando às 19h e terminando às 2h. Você deseja enviar uma notificação de manutenção com antecedência e deseja um tempo de atividade máximo do seu sistema. Você vai ficar acordado a noite toda, pronto para executar vários comandos e depois reiniciá-lo mais tarde? Não, você gostaria de usar atpara agendar essas tarefas, depois ir para a cama / brincar de skyrim e esquecê-lo.

Pare de prejudicar Monica
fonte
1

attambém pode ser uma maneira realmente útil de disparar lembretes. Minha máquina atual de desenvolvimento está executando o OSX; portanto, ato simples notify.bashque juntei pode 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
fonte