crontabは、Linuxシステム上のすべてのタイプのタスクを自動化するために使用されます。これは、意欲的なシステム管理者が学ぶために特に重要なスキルです。初心者の場合、始めるのは少し難しいかもしれません。構文は他のほとんどのコマンドとは異なります。このため、このレッスンでは、いくつかの使用法を紹介する前に、もう少し背景情報を紹介します。
crontabに恐れをなさないでください
私にとって、Crontabは初心者として最も恐ろしいLinuxの概念の1つでした。 「crontab」を紹介されたとき、コマンドラインを使用していたのはほんの数日で、「ls」や「cd」などの基本的なファイルナビゲーションコマンドの使用方法をほとんど理解していませんでした。
私が個人的な学習履歴を持ち出す理由は、多くの新しいLinuxユーザーが、「crontab」の独自の構文を見ると、同様に圧倒されると思うかもしれないからです。でも安心できますが、それがどのように機能するかを理解すれば、それほど複雑ではありません。
このガイドで学ぶこと
理解しやすいように、crontabに関連するいくつかの概念を簡単に紹介したいと思います。私の目標は、これらの概念を文脈化して、それらが互いにどのように関連しているかを説明することです。
- cronの概念の簡単な紹介
- ユーザーアカウントのCrontabアクセスを設定する
- cronジョブでエラーを処理する
- cronジョブの作成
まず、「cron」に関する基本的な概念をいくつか紹介します。
Cron、Crontab、CronJobの違い
物事を視覚的に見ることは、新しいトピックをより迅速に理解するのに役立ちます。これらの3つのトピックが一般的にどのように相互作用するかについての内訳は次のとおりです。次に、それぞれについて詳しく説明します。
要素 | Linux名 | 意味 |
---|---|---|
デーモン | 「crond」 | 「鬼」または「日門」と発音します。これらはLinuxのバックグラウンドシステムプロセスです。 |
テーブル | 「crontab」 | crontabコマンドを入力するときに、このテーブルに行を書き込みます。各「*」アスタリスクは、時間のセグメントと各行の対応する列を表します。 |
仕事 | Cron Job | 実行する特定のタスクを、指定された時間IDと組み合わせて行に記述します |
CrontabはCronTableの略です。これは、フィールドが空白で区切られたテーブルのような構造を作成するLinuxシステムファイルです。ユーザーは、各フィールドに値を割り当てることでテーブルにデータを入力できます(アスタリスク)。
記事全体を通して、私はこの考えを説明するために異なる言語を使用するかもしれません。明確にするために、フィールド、セル、列などはすべて同じものを指します。役立つ場合は、crontabをミニデータベースのように考えることができます。
データベースに慣れていない場合は、空白のExcelファイルのセルを想像できます。いずれにせよ、このアナロジーでは、各アスタリスクは、そのヘッダーによって意味が定義される列を表します。最後の列は、コマンドまたはスクリプトの呼び出しになります。完全な各行は、個別のジョブと考えることができます。ジョブ、タスクなどはすべて互換性のある用語ですが、これらは「cronジョブ」と呼ばれることがよくあります。
テーブルと、それをジョブで埋める方法については、すでに説明しました。しかし、それらのジョブはどのように実行されますか?デーモンと呼ばれるシステムプロセスは、Linuxマシンのバックグラウンドで実行されます。
多くの異なるサービス用のデーモンがあります。これらは通常、サービス名の末尾に「d」を付けることで名前が付けられます。
当然、cronデーモンは「crond」と呼ばれます。そのデーモンを実行するために私たちの側でアクションは必要ありませんが、コマンドが正しく機能していないと思われる場合は、psコマンドを使用して「crond」が実行されていることを確認できます。
ps aux | grep crond
このコマンドは、現在のプロセスですべてのユーザーを検索し、「crond」のインスタンスを返します。
[email protected]:~$ ps ux | grep crond
christo+ 8942 0.0 0.0 18612 840 pts/0 S+ 02:16 0:00 grep --color=auto crond
デーモンが自分のユーザーアカウントで実行されていることがわかります。一日中ファイルに出力を入力しているので、これはすでに知っていました。
cronがどのように機能するかについて漠然と理解できたので、crontabを使用する構文を見てみましょう。この情報を頭の中で表として想像できれば、混乱が少なくなることを願っています。
crontab [options]
* * * * * <command>
OR
* * * * * <path/to/script>
私たち自身の例を立ち上げて実行したら、これがあなたに役立つことを約束します。 cronジョブの構文をもう一度見てみましょう。

ご覧のとおり、crontab構文には5つのアスタリスクがあります。これらのアスタリスクのそれぞれが表すものは次のとおりです。
1st | 2番目 | 3番目 | 4番目 | 5日 | |
---|---|---|---|---|---|
* | * | * | * | * | |
ID | 分 | 時間 | 日-日付 | 月 | 曜日名 |
値 | 0-59 | 0 -23 | 1-31 | 1-12 | 0-6 |
注:0〜6日の名前は日曜日から始まります。
タスクをスケジュールするには、適切なアスタリスクを目的の値に置き換えます。
簡単に練習してみましょう。以下のようなcrontabを使用している場合、ジョブはいつ実行されると思いますか?
0 0 * * 0
Q:このようにジョブを設定すると、コマンドはいつ実行されますか?
A.月曜日から土曜日まで1時間ごと
B.日曜日は毎分
C.月曜日から土曜日の深夜のみ
D.日曜日の深夜のみ
ここでの答えはDです。毎週日曜日の00:00[深夜]に「コマンド」を実行します。
Crontabはユーザー固有です。あなたはすでにそれについて少し触れました。以前にcrontabを使用したことがある可能性があると思われる場合は、 crontab -lを使用して確認できます。 。
[email protected]:~$ crontab -l
no crontab for christopher
[email protected]:~$ crontab -e
no crontab for christopher - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/code
3. /bin/ed
Choose 1-3 [1]: 1
このコマンドを実行すると、このシステムにcrontabがないことがわかります。
まだcrontabを作成していないので、-e
を使用すると テーブルを編集するために、好みのテキストエディタの入力を求められます。 Nanoは、最も使いやすいプログラムとして提案されています。 VimやEmacsなどの任意のコマンドラインテキストエディタを使用できます。本当にあなた次第です。
最初は成功しない場合は、Sudo
crontab -eを試行した場合 コマンドを実行してもこの結果が得られない場合は、テーブルを作成するためのユーザー権限がない可能性があります。 sudoアクセス権がある場合は、sudoを使用してcrontabを設定できます。
sudo crontab -e <your_username>
システムは自動的にcrontabを適切な宛先にロードします。これは配布によって異なりますが、多くの場合、 / var / spool / cron / crontabsのようなディレクトリにあります。 。ここでファイルを編集しようとしないでください。
cronジョブでエラーが発生した場合はどうなりますか?
デフォルトの動作は、出力を電子メールで送信することです。この機能は、ネットワークドメインの「ローカル」メールにログを自動的に送信できる管理者向けに設計されています。
メールサーバーがある場合は、これを自分で設定できます。 Gmailまたは同様のサービスへのメール出力を自動化する方法もあります。ただし、これらの方法はこの記事の範囲を超えています。
代わりに、エラーを回避する2つの一般的な方法を見ていきます。
1)出力をファイルに送信
このタイプの出力の送信先ファイルを指定して、>>
を使用できます。 出力をリダイレクトします。
>>
を使用する 単一の>
が存在する間、既存のファイルに情報を追加します シンボルはファイルを上書きします。これは、レコードを頻繁に更新する大きなログファイルを維持するかどうかを知るために重要です。ファイルが存在しない場合は、どちらも自動的にファイルを作成します。
cronジョブの例:
0 * * * * echo "Linux is Cool!" >> ~/crontab_log.txt
2)/ dev/nullを使用
これは、本質的にデータを削除することにより、電子メールオプションをバイパスします。標準エラー(「2」)と標準出力(「1」)の両方がnullファイルに送信されます。
0 0 * * * echo "Why are you silencing me every night at midnight?" > /dev/null 2>&1
例にechoコマンドを使用していることに気付いたかもしれません。特に理由はありませんが、変更の確認や「作業の確認」が簡単にできます。
プログラミングを行ったことがあれば、printコマンドを使用してロジックをテストした可能性があります。これは同じ概念です。
独自のcronジョブを設定してみましょう。すでに「一緒に遊んでいる」なら、それは素晴らしいことです。そうでない場合は、今がその端末を準備して楽しんでください。
crontabの例:コマンドとスクリプトのスケジューリング
出力がどのようにルーティングされるかを説明しているときに、いくつかの例を示しました。それらはあなたにとって意味がありましたか?
最初の例を見ていきましょう。
分 | 時間 | 日-日付 | 月 | 曜日名 | コマンド |
---|---|---|---|---|---|
0 | * | * | * | * | echo「Linuxはかっこいい!」>>〜/ crontab_log.txt |
分値を「0」に設定すると、コマンドは1時間ごと、その時間に実行されます。
一度に複数の値を編集できます。必要に応じて、5つのアスタリスクすべてを仕様に置き換えることができます。
分 | 時間 | 日-日付 | 月 | 曜日名 | コマンド |
---|---|---|---|---|---|
* / 5 | 3-6 | * / 5 | * / 2 | 0,6 | echo「Linuxはかっこいい!」>>〜/ crontab_log.txt |
これが何を言っているのか分かりますか?このチュートリアルのために、私はこの仕事を特に混乱させました。 「野生の」パラメータが非常に多いものがあるのは珍しいことですが、それを解読できるかどうか見てみましょう。このような場合、私はフィールドを逆方向に処理するのが好きです。
一緒に試してみましょう:
フィールド | 値 | 意味 |
---|---|---|
曜日名 | 0,6 | 土曜日と日曜日 |
月 | * / 2 | 2か月で割り切れる毎月。 |
日付 | * | すべての日付 |
時間 | 3-6 | 午前3時から6時の間 |
分 | * / 5 | 5分ごと |
平易な言葉で:
したがって、隔月、週末、日付に関係なく、このコマンドは午前3時から午前6時まで5分ごとに実行されます。
うわー、それは複雑でした。それに従うことができれば、最高のものを使ってcronジョブを実行する準備ができています。
この時点まで、あなたが書いたcronジョブはたった1つのことをしていました。これは便利な場合がありますが、複数のタスクを実行したい場合があります。
幸いなことに、これは可能であるだけでなく、非常に簡単です。元の構文例を思い出すと、スクリプトへのパスを使用することもできます。
これはbashだけに限らず、必要に応じてPythonまたはPerlを使用するスクリプトを実装することもできます。
私たちの目標は何ですか?
- ジョブは毎晩午前3時に処理されます
- /Documentsフォルダーをzipファイルにバックアップします
- ディレクトリ内のすべてのリストを含むテキストファイルを生成します
- バックアップファイルとテキストファイルを現在の日付のサブフォルダーに複製するアーカイブフォルダーを作成します
our_backup_script.sh
#! /bin/bash
DATE=$(date +%d-%m-%Y)
# Date in format DAY##-MONTH##-YEAR####
mkdir -p ~/archive/$DATE
# create a folder for today's date in the archive, if archive doesn't exist, make archive
ls -al ~/Documents > ~/archive/$DATE/contents.txt
# create a text file listing the contents of the documents folder
cd ~/ && tar -cpzf $DATE.docs.backup.gz Documents/*
# change to parent directory to tar /Documents folder
cp ~/$DATE.docs.backup.gz ~/archive/$DATE/documents_archive.gz
# one .gz file is left in the home directory, a clone is sent to our archive under it's date
[email protected]:~$ ls
Desktop Downloads Music Pictures Public Videos
Documents ENV our_backup_script.sh projects Templates 'VirtualBox VMs'
[email protected]:~$ bash our_backup_script.sh
[email protected]:~$ ls
25-11-2019.docs.backup.gz Documents Music projects Videos
archive Downloads our_backup_script.sh Public 'VirtualBox VMs'
Desktop ENV Pictures Templates
[email protected]:~$ ls archive/25-11-2019/
contents.all_files.txt documents_archive.gz
このスクリプトをcronジョブにするために残されていることはすべてです。
crontab -e
そして、そこに以下を追加します:
0 3 * * * bash ~/our_backup_script.sh
あなたは成功しましたか?私のものでした。実際、私はこのアイデアがとても気に入りました。これを毎日のバックアップとして保持するかもしれません。私が行う変更の1つは、クラウドストレージと同期するマシン上のフォルダーにアーカイブを移動することです。
Linuxでジョブをスケジュールする別の方法は、atコマンドを使用することです。あなたもそれについて学ぶことに興味があるかもしれません。
作成したいスクリプトのアイデアはありますか?この記事はcrontabをよりよく理解するのに役立ちましたか?コメントで私たちと共有してください。