\r\n\r\n
一度だけ行われるLinuxのジョブをスケジュールしたい場合、cronは多すぎる。atの一連のコマンドだけで十分だシステムに空きリソースがあるときだけプロセスを実行したい場合は、バッチ処理を使用することができます。
cronデーモンは、特定の時刻に実行するジョブのリストを管理します。これらのタスクやプログラムは、スケジュールされた時刻にバックグラウンドで実行されます。このため、繰り返しが必要なタスクのスケジューリングに大きな柔軟性を持たせることができます。1時間に1回、1日に1回、特定の時間に1回、あるいは月や年に1回、タスクを実行する必要があるかどうかは、cronで設定することができます。
ただし、タスクを1回だけ実行するようにスケジュールしたい場合は、この方法は役に立ちません。もちろん、cronで設定することもできますが、タスク実行後にcrontabのエントリを戻して削除することを忘れないようにしなければならず、不便です。
Linuxでは、自分が困っていることがあれば、他の人も困っていることがほとんどです。幸いなことに、Unix系OSは古くから存在するため、誰かが既に解決策を作っている可能性が高いです。
上記のような問題に対して、彼らは持っている、である。
関連:Linuxでタスクをスケジュールする方法:Crontabファイル入門
ubuntu 18.04 と manjaro 18.1.0 にインストールする必要があります (fedora 31 にはインストール済みです)。
Ubuntuにatをインストールするには、次のコマンドを使用します。
sudo apt-get install atインストールが完了したら、次のコマンドでatデーモンを起動することができます。
sudo systemctl enable --now atd.serviceManjaroの場合、以下のコマンドでインストールします。
sudo pacman -Sy atインストールが完了したら、以下のコマンドを入力して、atデーモンを起動します。
sudo systemctl enable --now atd.serviceどのディストリビューションでも、以下のコマンドを入力することで、atdデーモンが起動していることを確認することができます。
ps -e | grep atdatを使うには、実行する日時を指定する必要がある。これらのコードの書き方には非常に自由度が高いが、それについては後述する。
ただし、インタラクティブに使用するとはいえ、事前に日時を提示していただく必要があります。コマンドラインに何も書かれていない場合、あるいは日付と時刻以外のものを入力した場合、atは以下のように「文字化けした時刻」で応答します。
at at banana日付と時刻は明示的または相対的なものである。例えば、1分後にコマンドを実行したいとします。atは「now」の意味を知っているので、次のようにnowを使って1分足すことができます。
at now + 1 minuteat はメッセージと 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 minute1分後、次のように入力し、メールを再確認してください。
mailおい、メールが来たぞ! 最初のメッセージを読むには、1を押してからEnterキーを押してください。
スクリプト内のコマンドがエラーメッセージを生成したため、からメールを受け取りました。この場合、以前スクリプトを実行したときに削除しているので、削除するファイルはありません。
D+Enterでメールを削除し、Q+Enterでメールソフトを終了します。
タイムフォーマットを使用する場合、多くの柔軟性があります。ここではいくつかの例を示します。
以下のように、atqコマンドを入力すると、スケジュールされたジョブのキューを表示することができます。
キュー内の各コマンドについて、atq は以下の情報を表示します。
また、atはインタラクティブに使うだけでなく、コマンドで使うこともできます。
以下のように、atにコマンドをインポートすることができます。
echo "sh ~/sweep.sh" | at 08:45 AM課題はatで受け付け、スケジュール化し、課題番号と実行日を従来通り報告する。
関連:Linuxでのパイプの使い方
また、一連のコマンドをファイルに保存して、それを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以下は、その仕事について教えてもらった詳細です。
batchコマンドの操作は、atコマンドと似ていますが、3つの大きな違いがあります。
バッチコマンドを使用する場合は、以下のようにコマンドライン引数なしで名前で起動します。
batch次に、atコマンドと同じようにタスクを追加します。
これにより、誰がatシリーズのコマンドを使用できるかというファイル制御を可能にするだけでなく、拒否することもできます。これらは、/etc ディレクトリに配置されます。デフォルトでは、denyファイルのみが存在し、インストール時に作成されます。
その仕組みはこうだ。
デフォルトでは、誰でも使用することができます。使用できる人を制限するには、Allow を使って使用できる人をリストアップします。これは、atを使えない人全員を拒否ファイルに追加するよりも良い方法です。
アイデア却下のファイルはこんな感じです。
sudo less /etc/at.denyこのファイルは、その上で使用できないオペレーティングシステムのコンポーネントをリストアップしています。これらのファイルの多くは、セキュリティ上の理由からそうすることができないようになっているので、ファイルからファイルを削除することは避けたい。
ここで、許可ファイルを編集します。DaveとMaryを追加しますが、他の人には使用させないようにします。
まず、次のように入力します。
sudo gedit /etc/at.allowエディターで、以下のように2つの名前を追加し、ファイルを保存します。
例えば、Ericというユーザーが次のように入力したとします。
at次のように拒否されます。
もう一度言いますが、エリックは書類を拒否するためにオフィスにいるのではありません。一度、誰かを入れると、他の人が使用を拒否されることを許可します。
このように、atとbatchはどちらも一度だけ実行すればよい作業に最適です。