Neden Linux'ta “at” komutuna ihtiyacımız var?


38

atKomutun kullanıldığı kodu inceliyordum . Etrafıma baktım ve toplu işleri yürütmek için kullanıldığını öğrendim. İşleri planlamak için kullanılır. Girdi olarak bir komut ve göreceli ya da mutlak bir zaman verilir.

Öyleyse ilk sorum şu: neden atkomut kullanılır? Hangi durumlarda kullanmak gerekir at? Yazılımı kaldırmaya çalışan bazı bash betiği kodları varken ve bazı arka plan servislerinin yeniden başlatılmasıyla karşılaştım.

İkinci sorum: Herhangi bir komutun toplu iş olarak yürütülmesi ile doğrudan komut çağırmak için (veya alt kabukta) bir komutun çalıştırılması arasındaki fark nedir?

Yanıtlar:


47

Bernhard'ın cevabı doğrudur: çok kullanıcılı sistemlerde, gecenin bazı geri kalan saatlerinde ağır programları yürütmek, hem işi veren kişi hem de iş arkadaşları için özellikle uygundur. “Güzel oynamak” ın bir parçası.

Doktora derecemin çoğunu yaptım. bu şekilde hesaplar, senaryoyu diğer insanlar makineyi meşgul tutarken işimin önceliğini azaltan güzel komutla birleştirirken, geceleri tüm sistem kaynaklarını kullanma yeteneğini koruyarak.

Programımın çalışıp çalışmadığını kontrol etmek ve gerekirse yeniden başlatmak için de aynı komutu kullandım.

Ayrıca, akılda tutmalı de önce yol yazılmıştır ekran, tmux bir müstakil kabuğuna sahip için basit bir yol, yani Sistemi çıkışım kez ölmeyeceğini biriydi böylece, vb, vb.

Son olarak, uzun zamandır etrafta olan crondan farklı olduğunu da fark etmelisiniz. Cron, bu nedenle tekrarlayan olmak gerçekten sabit aralıklarla sonsuza infaz edilmesi gereken sistem işler için daha uygun iken de, ara sıra olmasından farkı yatıyor: aslında, en (kendi ayarları ile, size kendi ortamını verir ve ortam değişkeninin seçimleri), cron minimal bir çevre değişkeni kümesi kullanırken ( örnek olarak PATH'taki farkı kontrol edin ).


15
Ayrıca, cron ile bir başka fark olarak görülmeye değer at, ortamınızı işin planlandığı gibi koruduğu: aynı çalışma dizini, ortam değişkenleri, ...
Carlos Campderrós

10
Orada da var batchneredeyse aynı olan at, görünüşe göre, ancak bunun yerine düşük yük bekleyecek ve at -q zbuna irade güzel kendisi tarafından iş at -q Zhem de güzel bir iş, sonra bir süre beklemek düşmesi yük bekleyin ve edecektir. Vay be, ne kadar nadiren kullanılan özellikler!
Ulrich Schwarz

16

atBilgisayarımın arkasında olmadığım zamanlarda, gece çalıştırmak istediğim veriler üzerinde bazı ağır işlemler yapmam gerektiğinde komutu kullanıyorum . Tabii ki ayrıldıktan hemen sonra süreci başlatabilirim, ama bu unutmaya meyilli bir şey.

Komutun sonucu, komut dosyasının veya komutun düzenli olarak yürütülmesinden farklı değildir.


15

Bu gibi sorularınız olduğunda daima man sayfalarına bakınız. Çok aydınlatıcı olabilirler.

Bu ne yapar

mektubu man sayfasında

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.

kullanım

Araçların kullanımı:

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 komutları içerir ( at, atq, atrmve batch). Sen kullanmak atve batch, işlerini planlamak için atqplanlanan neler olduğunu görmek için, ve atrmöncesinde Çalışıyorsa bir iş çıkarmak için.

$ at -f <cmd> timspec

timespec

atİşi yürütme zamanı farklı şekillerde belirtilebilir.

man sayfasında alıntı formu

At POSIX.2 standardını genişleterek oldukça karmaşık zaman özellikleri sağlar. Günün belirli bir saatinde bir işi yürütmek için HH: MM şeklindeki zamanları kabul eder. (Bu saat zaten geçmişse, ertesi gün varsayılır.) Ayrıca gece yarısı, öğlen veya çay saatini de (16: 00) belirleyebilirsiniz. veya akşam. Ayrıca, işin hangi gün yapılacağını, isteğe bağlı bir yıl ile ay adı gününde bir tarih vererek veya MMDD [CC] YY, AA / GG / [CC] YY biçiminde bir tarih vererek, GG.MM. [CC] YY veya [CC] YY-AA-GG. Bir tarihin özelliği, günün saatinin özelliklerini takip etmelidir. Ayrıca şimdiki zamanları + zaman zaman birimlerini, zaman birimlerinin dakika, saat, gün olabileceği zaman değerlerini verebilirsiniz.

Örnekler

Diyelim ki bu kabuk betiği var.

$ cat mycrontest.sh

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

Örnek çalışma:

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

İş gönderimlerinde örnek:

$ 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

Referanslar


atCygwin kurulumumda çok farklı bir versiyona sahip gibiyim - bağlantılı görünmüyor batch, hiçbir kısa seçenek desteklenmiyor, sessiz bir seçenek yok ve hiç manveya infosayfa eklenmemiş .
Hashim

@Hashim - cygwin kendi canavarıdır.
slm

6

Toplu işlerini UNIX / Linux'ta üç komuttan herhangi birini kullanarak yürütebilirsiniz - at, batch veya cron.

Belirli bir tarih ve saati kullanarak bir işte zamanlama

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

Evet, "at" ve kullanımı hakkındaki anlayışım var. Diğer insanlar daha ilgili olarak cevapladılar.
Akshay Patil

5

Ağ yöneticiniz, web sunucularınızda saat 7: 00'dan sonra ve öğlen 2'de bitecek bazı bakımların olacağı konusunda sizi bilgilendirir. Önceden bir bakım bildirimi yapmak istiyorsunuz ve sisteminizden maksimum çalışma süresi istiyorsunuz. Bütün gece uyuyacak, çeşitli komutlar vermeye hazır olacak ve daha sonra tekrar başlatacak mısın? Hayır, atbu görevleri planlamak için kullanmak , sonra yatmak / skyrim oynamak ve unut gitsin.


1

atAyrıca, hatırlatıcıları kovmak için gerçekten kullanışlı bir yol olabilir. Şu anki dev makinem OSX kullanıyor, bu yüzden bir araya atgetirdiğim basitlik notify.bashgerçekten yardımcı olabilir:

$ 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.