\r\n\r\n

Linuxでatとbatchを使ってコマンドをスケジュールする方法

もし、一度だけ発生するLinuxのジョブをスケジュールしたい場合、cronは多すぎです。システムに空きリソースがあるときだけプロセスを実行したい場合は、バッチプロセスを使用することができます...

一度だけ行われるLinuxのジョブをスケジュールしたい場合、cronは多すぎる。atの一連のコマンドだけで十分だシステムに空きリソースがあるときだけプロセスを実行したい場合は、バッチ処理を使用することができます。

リナックスアサインメントのスケジュール方法

cronデーモンは、特定の時刻に実行するジョブのリストを管理します。これらのタスクやプログラムは、スケジュールされた時刻にバックグラウンドで実行されます。このため、繰り返しが必要なタスクのスケジューリングに大きな柔軟性を持たせることができます。1時間に1回、1日に1回、特定の時間に1回、あるいは月や年に1回、タスクを実行する必要があるかどうかは、cronで設定することができます。

ただし、タスクを1回だけ実行するようにスケジュールしたい場合は、この方法は役に立ちません。もちろん、cronで設定することもできますが、タスク実行後にcrontabのエントリを戻して削除することを忘れないようにしなければならず、不便です。

Linuxでは、自分が困っていることがあれば、他の人も困っていることがほとんどです。幸いなことに、Unix系OSは古くから存在するため、誰かが既に解決策を作っている可能性が高いです。

上記のような問題に対して、彼らは持っている、である。

関連:Linuxでタスクをスケジュールする方法:Crontabファイル入門

atコマンドのインストール

ubuntu 18.04 と manjaro 18.1.0 にインストールする必要があります (fedora 31 にはインストール済みです)。

Ubuntuにatをインストールするには、次のコマンドを使用します。

sudo apt-get install at

インストールが完了したら、次のコマンドでatデーモンを起動することができます。

sudo systemctl enable --now atd.service

Manjaroの場合、以下のコマンドでインストールします。

sudo pacman -Sy at

インストールが完了したら、以下のコマンドを入力して、atデーモンを起動します。

sudo systemctl enable --now atd.service

どのディストリビューションでも、以下のコマンドを入力することで、atdデーモンが起動していることを確認することができます。

ps -e | grep atd

atコマンドの対話的な使い方

atを使うには、実行する日時を指定する必要がある。これらのコードの書き方には非常に自由度が高いが、それについては後述する。

ただし、インタラクティブに使用するとはいえ、事前に日時を提示していただく必要があります。コマンドラインに何も書かれていない場合、あるいは日付と時刻以外のものを入力した場合、atは以下のように「文字化けした時刻」で応答します。

at at banana

日付と時刻は明示的または相対的なものである。例えば、1分後にコマンドを実行したいとします。atは「now」の意味を知っているので、次のようにnowを使って1分足すことができます。

at now + 1 minute

at はメッセージと at プロンプトを表示し,ディスパッチするコマンドを入力するのを待ちますが,まず,以下の内容を考慮してください.

これは、少なくとも1つのshシェルのインスタンスを起動し、その中でコマンドを実行するように指示します。コマンドはbashshellでは実行されません。bashshellはshshellと互換性がありますが、より豊富な機能を備えています。

コマンドやスクリプトでBashが提供する機能やツールを使おうとしても、shが提供しない場合は失敗します。

コマンドやスクリプトがshで実行されるかどうかは、shコマンドでshシェルを起動すれば簡単に確認できます。

sh

コマンドプロンプトがドル記号($)に変わり、コマンドを実行し、正しく動作していることを確認できるようになりました。

Bashシェルに戻るには、exitコマンドを入力します。

exit

コマンドによる標準出力やエラーメッセージは表示されません。これは、shシェルがバックグラウンドタスクとして起動し、画面上のインターフェイスを持たずに実行されるからである。

コマンドの出力の良し悪しは、電子メールで送られます。社内メールシステムを通じて、atコマンドを実行している人に送信されます。つまり、社内の電子メールシステムの設定と構成が必要です。

多くの(ほとんどの)Linuxシステムでは、ほとんど必要ないため、内部電子メールシステムを搭載していません。そのような場合は、通常、sendmailやpostfixのようなシステムを使用します。システムに内部メールシステムがない場合、スクリプトにファイルに書き込ませるか、出力をファイルにリダイレクトしてロギングを追加することができます。

コマンドが標準出力やエラーメッセージを生成しない場合は、いずれにせよ電子メールを受信することはありません。Linuxの多くのコマンドは、成功を示すために沈黙しているので、ほとんどの場合、メールを受け取ることはありません。

関連:Linuxのstdin, stdout, stderrとは何ですか?

さて、いよいよコマンドを打ち込みます。今回の例では、scan.shというコマンドを使って、*.bak、*.tmp、*.oというファイルを削除することにします。以下のように、コマンドのパスを入力し、Enterキーを押します。

別のコマンドプロンプトが表示され、好きなだけコマンドを追加することができます。多くの場合、コマンドをスクリプトに入れ、そこからスクリプトを呼び出す方が簡単です。

Ctrl+Dでatにaddコマンドの完了を伝える。atは転送の終了を示す< EOT>を表示する。以下のように、ジョブ番号とジョブの実行予定日が表示されます。

ジョブが実行された後、次のように入力して内部メールを確認します。

mail

メールがない場合は、成功と判断してください。もちろん、この例では、*.bak、*.tmp、*.oのファイルが削除されているかどうかを確認し、コマンドが有効であることを確認することができます。

次のように入力すると、すべての処理が再度実行されます。

at now + 1 minute

1分後、次のように入力し、メールを再確認してください。

mail

おい、メールが来たぞ! 最初のメッセージを読むには、1を押してからEnterキーを押してください。

スクリプト内のコマンドがエラーメッセージを生成したため、からメールを受け取りました。この場合、以前スクリプトを実行したときに削除しているので、削除するファイルはありません。

D+Enterでメールを削除し、Q+Enterでメールソフトを終了します。

日付と時刻のフォーマット

タイムフォーマットを使用する場合、多くの柔軟性があります。ここではいくつかの例を示します。

  • 午前11時の走行:午前11時
  • 明日午前11時に実行:明日午前11時
  • 来週のこの日の午前11時に実行:来週の午前11時
  • この時間に、この日に、来週に実行する:来週
  • 来週の金曜日午前11時に実行:来週の金曜日午前11時に実行。
  • 来週の金曜日のこの時間に実行する:下周五
  • 来月のこの日、午前11時に実行する。来月のこの日、午前11時。
  • 特定日の午前11時に実行:2020年3月15日午前11時00分
  • 今から30分後に実行:現在+30分
  • 今から2時間後に実行:現在+2時間
  • 明日のこの時間に走る:在明天
  • 木曜日のこの時間に実行:木曜日
  • 午前12時のラン:ミッドナイト
  • 12:00に実行:正午
  • 英国人なら、ティータイム(午後4時)に実行するようコマンドをスケジュールすることもできます。ティータイム

ジョブキューを見る

以下のように、atqコマンドを入力すると、スケジュールされたジョブのキューを表示することができます。

キュー内の各コマンドについて、atq は以下の情報を表示します。

  • アサインメントID
  • 予定日
  • 予定時刻
  • 割り当てがあるキュー。キューには "a"、"b "などのラベルが貼られています。atでスケジュールされた通常のタスクはキュー "a "に、バッチ(後述)でスケジュールされたタスクはキュー "b "に移動します。
  • 仕事を取りまとめる人。

コマンドラインでのatの使用

また、atはインタラクティブに使うだけでなく、コマンドで使うこともできます。

以下のように、atにコマンドをインポートすることができます。

echo "sh ~/sweep.sh" | at 08:45 AM

課題はatで受け付け、スケジュール化し、課題番号と実行日を従来通り報告する。

関連:Linuxでのパイプの使い方

コマンドファイル内でatを使用

また、一連のコマンドをファイルに保存して、それをatに渡すこともできます。コマンドのプレーンテキストファイルであれば、実行可能なスクリプトである必要はありません。

ファイル名は、-f(ファイル)オプションを使って、次のように渡すことができる。

at now + 5 minutes -f clean.txt

にリダイレクトしても同じ結果になります。

at now + 5 minutes < clean.txt

スケジュールされたジョブをキューから削除する

スケジュールされたジョブをキューから削除するには、atrmコマンドを使用します。まず、キューを見て削除するジョブの番号を調べるには、atqを使用します。 次に、そのジョブ番号を使用して、次のようにatrmを使用します。

atq atrm 11 atq

課題の詳細表示の仕方

前述したように、遠い未来への仕事のスケジューリングが可能です。atqコマンドはキューにあるジョブを表示しますが、そのジョブが実行しようとする動作は表示しません。ジョブの詳細を見るには、-c(cat)オプションを使用します。

まず、atqを使って作品番号を求めます。

atq

ここで、ジョブ番号13を-cオプション付きで使用します。

at -c 13

以下は、その仕事について教えてもらった詳細です。

  • 1行目:このコマンドはshシェルで実行されることを告げています。
  • 2行目:ユーザーID、グループIDともに1000でコマンドが実行されることがわかります。これらは、atコマンドを実行している人の値です。
  • 3行目:あらゆるメールを受信する人。
  • 4行目:ユーザーマスクは22です。 これは、このshセッションで作成されるすべてのファイルのデフォルトパーミッションを設定するために使用されるマスクです。マスクは666から644(8進数でrw-r--r--に相当)を差し引いたものです。
  • 残存データ:主に環境変数。
  • 実行ディレクトリにアクセスできるかどうかを確認するテストの結果、アクセスできない場合はエラーを発生させ、ジョブの実行を中断します。
  • 実行するコマンド。コマンドが一覧表示され、予定されているスクリプトの内容が表示されます。なお、上記の例のスクリプトはBashで実行されていますが、shシェルで実行されることに変わりはありません。

バッチコマンド

batchコマンドの操作は、atコマンドと似ていますが、3つの大きな違いがあります。

  1. バッチコマンドのみ対話的に使用することができます。
  2. ジョブをキューに追加し、システムの平均負荷が1.5以下になったら、特定の時間にジョブをスケジューリングするのではなく、バッチコマンドでジョブを実行することが可能です。
  3. これらの理由から、バッチコマンドで日時を指定することはありません。

バッチコマンドを使用する場合は、以下のようにコマンドライン引数なしで名前で起動します。

batch

次に、atコマンドと同じようにタスクを追加します。

atコマンドのアクセス制御

これにより、誰がatシリーズのコマンドを使用できるかというファイル制御を可能にするだけでなく、拒否することもできます。これらは、/etc ディレクトリに配置されます。デフォルトでは、denyファイルのみが存在し、インストール時に作成されます。

その仕組みはこうだ。

  • 拒否:本サービスでジョブのスケジューリングに使用できないアプリケーションとエンティティをリストアップします。
  • Allow: at を使ってジョブをスケジュールできる人をリストアップします。allow ファイルが存在しない場合は、少なくとも reject ファイルのみを使用します。

デフォルトでは、誰でも使用することができます。使用できる人を制限するには、Allow を使って使用できる人をリストアップします。これは、atを使えない人全員を拒否ファイルに追加するよりも良い方法です。

アイデア却下のファイルはこんな感じです。

sudo less /etc/at.deny

このファイルは、その上で使用できないオペレーティングシステムのコンポーネントをリストアップしています。これらのファイルの多くは、セキュリティ上の理由からそうすることができないようになっているので、ファイルからファイルを削除することは避けたい。

ここで、許可ファイルを編集します。DaveとMaryを追加しますが、他の人には使用させないようにします。

まず、次のように入力します。

sudo gedit /etc/at.allow

エディターで、以下のように2つの名前を追加し、ファイルを保存します。

例えば、Ericというユーザーが次のように入力したとします。

at

次のように拒否されます。

もう一度言いますが、エリックは書類を拒否するためにオフィスにいるのではありません。一度、誰かを入れると、他の人が使用を拒否されることを許可します。

一発勝負に最適

このように、atとbatchはどちらも一度だけ実行すればよい作業に最適です。

  • 型にはまったことをする必要があるときは、atを使ってアレンジしてみましょう。
  • システム負荷が十分に低いときにのみタスクを実行したい場合は、バッチプロセスを使用してください。

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ