web-dev-qa-db-ja.com

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

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

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

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

39
Akshay Patil

ベルンハルトの返答は正しいです。マルチユーザーシステムでは、重いプログラムを夜のある神秘的な時間に実行できる機能は、ジョブを送信する人と同僚の両方にとって特に便利です。それは「ニースをする」の一部です。

私は私の博士号のほとんどをしました。このように計算し、スクリプトをNiceコマンドと組み合わせて、他の人がマシンをビジー状態にしていたときに常に私の作業の優先順位を下げ、すべてのシステムリソースを独占する機能をそのままにしました。夜に。

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

また、atscreen、tmuxなどの前に書かれたため、シェルを切り離す簡単な方法、つまり、システムからログオフするとシェルが死ぬことはありません。

最後に、これも古くからあるcronとは異なることに注意してください。違いは、時々である一方で、cronは非常に繰り返しが多いため、固定間隔で永久に永久に実行する必要があるシステムジョブにより適しているということです。実際、atは、環境変数の独自の設定(および選択)を使用して独自の環境を提供し、cronは環境変数の最小セットを使用します([〜#〜]パス[〜#〜]、例として)。

48
MariusMatutiae

コンピューターの背後にいない夜間に実行したいデータに対して重い処理を行う必要がある場合は、atコマンドを使用します。もちろん、帰ったらすぐに始められますが、これは忘れがちです。

コマンドの結果は、スクリプトまたはコマンドの定期的な実行と同じです。

16
Bernhard

このような質問がある場合は、常にmanページを参照してください。彼らは非常に啓発することができます。

それがすること

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

atには4つのコマンド(atatqatrm、およびbatch)が含まれています。 atbatchを使用してジョブをスケジュールし、atqを使用して何がスケジュールされているかを確認し、atrmを使用して実行前にジョブを削除します。

$ at -f <cmd> timspec

タイムスペック

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

manページの抜粋フォーム

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

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

$ 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

参考文献

15
slm

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

6
OrangeDog

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

特定の日時を使用して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
6
Roshan Bagdiya

atは、リマインダーを起動する非常に便利な方法にもなります。私の現在の開発マシンはOSXを実行しているので、atとシンプルなnotify.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
1
Morgen