Linuxで「at」コマンドが必要なのはなぜですか?


38

atコマンドを使用するコードを勉強していました。周りを見てみると、バッチジョブの実行に使用されていることがわかりました。ジョブのスケジュールに使用されます。入力、コマンド、および時刻として、相対または絶対で指定されます。

だから、私の最初の質問は:なぜatコマンドが使用されているのですか?どの状況で使用する必要がありますatか?ソフトウェアをアンインストールしようとするbashスクリプトコードが存在し、バックグラウンドサービスが再起動される場合に遭遇しました。

私の2番目の質問:コマンドをバッチジョブとして実行することと、コマンドを直接呼び出して(またはサブシェルで)実行することの違いは何ですか?

回答:


47

Bernhardの回答は正しいです。マルチユーザーシステムでは、仕事を提出する人と同僚の両方にとって、夜間の不気味な時間に重いプログラムを実行する機能は特に便利です。それは「いいプレイ」の一部です。

私はほとんどの博士号を取得しました。この方法で計算し、スクリプトをナイスコマンドと組み合わせて、夜間にすべてのシステムリソースを独占する能力をそのままにしながら、他の人がマシンをビジー状態に保つたびに作業の優先度を降格しました。

同じコマンドを使用して、プログラムが実行されているかどうかを確認し、必要に応じて再起動しました。

また、atscreenやtmuxなどの前に書かれているため、切り離されたシェル、つまりシステムからログオフしても死ぬことのない簡単な方法であることに注意してください。

最後に、これも長い間使用されてきたcronとは異なることに注意してください。違いはたまにあるという事実にありますが、cronは非常に反復的であるため、一定の間隔で永久に実行する必要のあるシステムジョブに適しています。実際、atは独自の環境で、独自の設定(環境変数の選択)、cronは環境変数の最小限のセットを使用します(例としてPATHの違いを確認してください)。


15
また、cronとの別の違いとして指摘する価値があるのatは、ジョブがスケジュールされたときと同じように環境を保持することです。同じ作業ディレクトリ、環境変数、...
CarlosCampderrós13年

10
もありますがbatch、これはにほぼ同じですがat、代わりに低負荷を待機し、明らかにat -q zそれ自体でat -q Zジョブをうまく処理しますが、時間を待ってから負荷が低下するのを待って、ジョブを同様に処理します。うわー、めったに使用されない機能の負荷!
ウルリッヒ・シュワルツ

16

atコマンドを使用するのは、夜間にコンピューターの後ろにいないときに実行したいデータに対して重い処理を行う必要がある場合です。もちろん、出発直後にプロセスを開始することもできますが、これは忘れがちなものです。

コマンドの結果は、スクリプトまたはコマンドの定期的な実行と変わりません。


15

このような質問がある場合は、常に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.

使用法

ツールの使用法:

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つのコマンドを含む(atatqatrm、およびbatch)。atおよびbatchを使用して、ジョブをスケジュールし、スケジュールatqを確認atrmし、実行する前にジョブを削除します。

$ at -f <cmd> timspec

タイムスペック

atジョブを実行する時間は、さまざまな方法で指定できます。

マニュアルページの抜粋フォーム

Atでは、POSIX.2標準を拡張するかなり複雑な時間指定が可能です。HH:MMという形式の時刻を受け入れて、特定の時刻にジョブを実行します。(その時間がすでに過ぎている場合、翌日が想定されます。)深夜、正午、またはティータイム(午後4時)を指定することもでき、午前中に実行するためにAMまたはPMをサフィックスとして付けることができます。または夕方。また、オプションで年を付けてmonth-name dayの形式で日付を指定するか、MMDD [CC] YY、MM / DD / [CC] YYの形式で日付を指定することにより、ジョブを実行する日を指定することもできます。 DD.MM. [CC] YYまたは[CC] YY-MM-DD。日付の指定は、時刻の指定に従う必要があります。また、now + countの時間単位を指定できます。時間単位は分、時間、日、

このシェルスクリプトがあるとします。

$ cat mycrontest.sh

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

サンプル実行:

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

ジョブ送信時のサンプル:

$ 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

参照資料


atCygwinのインストールで使用できるバージョンが非常に異なるようです。リンクされていないようbatchで、短いオプションはまったくサポートされていません。静かなオプションはなくmaninfoページは含まれていません。
ハシム

@Hashim-cygwinはそれ自身の獣です。
slm

6

UNIX、Linuxでは、at、batch、cronの3つのコマンドのいずれかを使用してバッチジョブを実行できます。

特定の日時を使用してatジョブをスケジュールする

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

はい、「at」とその使用法について理解しています。他の人々はより適切にそれに答えた。
アクシェイパティル

5

ネットワーク管理者は、午後7時から午前2時までにWebサーバーのメンテナンスが行われることを通知します。事前にメンテナンス通知を提供し、システムの最大稼働時間を確保したい場合。一晩中起きて、さまざまなコマンドを実行する準備ができていて、後でもう一度起動しますか?いいえ、atこれらのタスクのスケジュールに使用してから、就寝/スカイリムをプレイし、それを忘れます。


1

atまた、リマインダーを起動するための本当に便利な方法にすることができます。私の現在の開発マシンはOSXを実行しているのでatnotify.bash一緒にまとめたシンプルなものは非常に役立ちます。

$ 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.