Mengapa kita membutuhkan perintah "at" di Linux?


38

Saya sedang mempelajari kode di mana atperintah itu digunakan. Saya melihat sekeliling dan menemukan bahwa itu digunakan untuk melakukan pekerjaan batch. Ini digunakan untuk menjadwalkan pekerjaan. Itu diberikan, sebagai input, perintah, dan waktu, relatif atau absolut.

Jadi, pertanyaan pertama saya adalah: mengapa atperintah itu digunakan? Dalam situasi apa seseorang perlu menggunakan at? Saya telah menjumpainya ketika ada beberapa kode skrip bash yang mencoba untuk menghapus instalasi perangkat lunak dan ketika beberapa layanan latar belakang harus dimulai kembali.

Pertanyaan kedua saya: Apa perbedaan antara menjalankan perintah apa pun sebagai pekerjaan batch dan menjalankan perintah dalam memanggil perintah secara langsung (atau dalam subkulit)?

Jawaban:


47

Jawaban Bernhard benar: dalam sistem multi-pengguna, kemampuan untuk menjalankan program berat pada beberapa jam yang tidak menyenangkan pada malam hari sangat nyaman, baik bagi orang yang mengirimkan pekerjaan, dan rekan kerjanya. Itu adalah bagian dari "bermain baik".

Saya melakukan sebagian besar Ph.D. perhitungan dengan cara ini, menggabungkan skrip dengan perintah yang bagus yang menurunkan prioritas pekerjaan saya setiap kali orang lain membuat mesin tetap sibuk, sementara tetap menyisakan kemampuannya untuk membawa semua sumber daya sistem pada malam hari.

Saya menggunakan perintah yang sama untuk memeriksa apakah program saya berjalan, dan untuk me-restart jika perlu.

Juga, Anda harus ingat bahwa pada saat ditulis sebelum layar, tmux , dan seterusnya, sehingga cara sederhana untuk memiliki shell terpisah, yaitu, yang tidak akan mati setelah Anda logout dari sistem.

Terakhir, Anda juga harus memperhatikan bahwa ini berbeda dari cron, yang juga telah ada sejak lama. Perbedaan terletak pada kenyataan bahwa di adalah sesekali, sementara cron, begitu berulang-ulang, lebih cocok untuk pekerjaan sistem yang benar-benar harus dijalankan selamanya pada interval yang tetap: pada kenyataannya, di memberikan lingkungan Anda sendiri, dengan pengaturan sendiri ( dan pilihan) variabel lingkungan, sementara cron menggunakan sekumpulan variabel lingkungan minimal (cukup periksa perbedaan dalam PATH , sebagai contoh).


15
Juga layak untuk ditunjukkan sebagai perbedaan lain dengan cron, yaitu atmempertahankan lingkungan Anda seperti ketika pekerjaan dijadwalkan: direktori kerja yang sama, variabel lingkungan, ...
Carlos Campderrós

10
Ada juga batch, yang hampir identik dengan at, tetapi sebagai gantinya akan menunggu beban rendah, dan tampaknya, at -q zakan menyenangkan pekerjaan dengan sendirinya, sedangkan at -q Zakan menunggu waktu, lalu menunggu beban turun, dan pekerjaan bagus juga. Wow, betapa banyak fitur yang jarang digunakan!
Ulrich Schwarz

16

Saya menggunakan atperintah ketika saya perlu melakukan beberapa pemrosesan data yang berat, yang ingin saya jalankan pada malam hari, ketika saya tidak berada di belakang komputer saya. Tentu saja saya bisa memulai proses tepat setelah saya pergi, tetapi ini adalah sesuatu yang saya cenderung lupa.

Hasil dari perintah tidak berbeda dari pelaksanaan skrip atau perintah secara teratur.


15

Ketika Anda memiliki pertanyaan seperti ini, selalu lihat halaman manual. Mereka bisa sangat mencerahkan.

Apa yang dilakukannya

kutipan dari pada halaman 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.

Pemakaian

Penggunaan alat:

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

attermasuk 4 perintah ( at, atq, atrm, dan batch). Anda menggunakan atdan batchmenjadwalkan pekerjaan, atquntuk melihat apa yang dijadwalkan, dan atrmuntuk menghapus pekerjaan sebelum menjalankannya.

$ at -f <cmd> timspec

Timespec

Waktu untuk menjalankan atpekerjaan dapat ditentukan dengan berbagai cara.

formulir kutipan di halaman manual

Di memungkinkan spesifikasi waktu yang cukup kompleks, memperluas standar POSIX.2. Ia menerima waktu dari bentuk HH: MM untuk menjalankan pekerjaan pada waktu tertentu dalam sehari. (Jika waktu itu sudah lewat, hari berikutnya diasumsikan.) Anda juga dapat menentukan tengah malam, siang, atau minum teh (4 sore) dan Anda dapat memiliki waktu siang hari yang dilengkapi dengan AM atau PM untuk berjalan di pagi hari atau malam hari. Anda juga dapat mengatakan hari apa pekerjaan akan dijalankan, dengan memberikan tanggal dalam bentuk bulan-nama hari dengan tahun opsional, atau memberikan tanggal dari formulir MMDD [CC] YY, MM / DD / [CC] YY, DD.MM. [CC] YY atau [CC] YY-MM-DD. Spesifikasi tanggal harus mengikuti spesifikasi waktu hari. Anda juga dapat memberikan waktu seperti sekarang + menghitung satuan waktu, di mana satuan waktu dapat berupa menit, jam, hari,

Contohnya

Katakanlah Anda memiliki skrip shell ini.

$ cat mycrontest.sh

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

Contoh dijalankan:

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

Contoh pada pengiriman pekerjaan:

$ 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

Referensi


Saya tampaknya memiliki versi yang sangat berbeda dari yang attersedia pada instalasi Cygwin saya - sepertinya tidak terkait batch, tidak ada opsi pendek yang didukung, tidak ada opsi sunyi, dan tidak ada manatau infohalaman disertakan.
Hashim

@Hashim - cygwin adalah binatang buas itu sendiri.
slm

6

Anda dapat menjalankan pekerjaan batch di UNIX / Linux menggunakan salah satu dari tiga perintah - at, batch atau cron.

Jadwalkan suatu di tempat kerja menggunakan tanggal dan waktu tertentu

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

Ya, saya memiliki pemahaman tentang "at" dan penggunaannya. Orang lain telah menjawabnya dengan lebih relevan.
Akshay Patil

5

Administrator jaringan Anda memberi tahu Anda bahwa beberapa pemeliharaan akan terjadi pada server web Anda mulai pukul 19:00 dan selesai pada pukul 02:00. Anda ingin melayani pemberitahuan pemeliharaan sebelumnya, dan Anda ingin waktu maksimum dari sistem Anda. Apakah Anda akan begadang semalaman, siap untuk menjalankan berbagai perintah, dan kemudian mulai lagi nanti? Tidak, Anda ingin menggunakannya atuntuk menjadwalkan tugas-tugas ini, lalu pergi tidur / bermain skyrim dan lupakan saja.


1

atjuga bisa menjadi cara yang sangat berguna untuk melepaskan pengingat. Mesin dev saya saat ini menjalankan OSX, jadi atdan sederhana notify.bashyang saya buat bersama bisa sangat membantu:

$ 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.