Crontabを使用してLinuxでタスクをスケジュールする

  • Cron はスケジュールされたタスクを実行するデーモンであり、Crontab は時間とコマンドの 5 つのフィールドに基づく柔軟な構文を使用してタスクが定義されるファイルです。
  • 時間、権限、絶対パス、環境変数を適切に構成することが、cron ジョブがサイレント エラーなしで正しく実行されるようにするための鍵となります。
  • Cron を使用すると、バックアップ、クリーンアップ、更新、監視を自動化できますが、計画が不十分だとシステムのパフォーマンスとセキュリティに影響を及ぼす可能性があります。
  • より複雑なシナリオや他のシステムでは、Anacron、Fcron、launchd、または外部サービスなどのツールや代替手段があり、Cron を拡張または置き換えることができます。

Crontabを使用してLinuxでタスクをスケジュールする

Linuxを日常的に使うなら、遅かれ早かれ必要になるだろう CronとCrontabで繰り返しタスクを自動化するバックアップ、アップデート、レポート生成、ファイルのクリーンアップ、監視…これらすべてを手動で行うのは時間がかかり、忘れてしまいがちです。そこで、何十年にもわたってUnixおよびGNU/Linuxシステム管理の礎となってきたCronの出番です。

Crontabの構文は一見少し難しそうに思えるかもしれませんが、そのロジックを理解すれば、 LinuxでCrontabを使ってタスクをスケジュールするのは見た目よりもはるかに簡単ですこの記事では、Cron とは何か、Crontab とは何か、ルールの記述方法、エラーのデバッグ方法、パフォーマンスへの潜在的な影響、使用できる外部ツール、他のシステムでの代替手段、家庭とビジネスの両方での使用例など、包括的なガイドを提供します。

CronとCrontabの違い

CronとCrontabはよく同じものであるかのように語られますが、実際には これらは連携して動作する 2 つの異なる部分です。この違いを理解しておくと、実行されていないタスクをデバッグする必要があるときに多くのトラブルを回避できます。

  • クロン これは、システムの起動直後からバックグラウンドで実行されるデーモンです。その役割は非常にシンプルです。 1分ごとに一連の設定ファイルを確認する システムの日付と時刻に従ってスケジュールされたタスクを実行する必要があるかどうかを確認します。
  • crontab、その間、 これらのタスクが定義されているテキストファイル各ユーザーは、独自のcrontabファイルを持つことができ、そこに独自のルールとスクリプトを記述できます。これらのファイルはユーザーの権限で実行されます。Cronデーモンはこれらのファイルを読み取り、適切なタイミングでコマンドを実行します。

最近のLinuxディストリビューションでは、デフォルトで両方のコンポーネントが利用可能になっているので、 ほぼすべてのディストリビューションで定期的なタスクをスケジュールできますDebian、Ubuntu、Oracle Linux、CentOS、Rocky、Fedora など。

cron

Cron とは何ですか? システム時間がなぜ重要なのですか?

クローンとは Linuxの起動時に起動するシステムデーモンこれは通常、古典的なブートスクリプトを介して起動されます。 の/ etc / init.dディレクトリ または同等のルート /etc/rc.dまたはsystemdユニット(ディストリビューションに応じてcrondまたはcronサービス)を使用します。1分ごとにチェックを行います。

/etc/crontab、/etc/cron.d、/var/spool/cron、/var/spool/cron/crontabs (正確なパスはディストリビューションによって異なります)、現在の分に一致するエントリを検索します。見つかった場合は、指定されたコマンドを実行します。

多くの人が見落としているのは Cronはシステム時間に完全に依存している時計やタイムゾーンが正しく設定されていない場合、タスクは間違った時間に実行されます。最新のシステムで時刻を確認するには、以下のコマンドを使用します。

timedatectl

このコマンドは、現地時間、UTC、タイムゾーン、システムがNTP(ネットワークタイムプロトコル)サーバーと同期しているかどうかを表示します。 NTP同期がアクティブですそうすれば時計が自動的に修正されるからです。

タイムゾーンが間違っている場合は、次のように変更できます。 timedatectl set-timezone ヨーロッパ/マドリード または、お住まいの国に一致する別のゾーンを選択してください。また、多くのLinuxインストールではNTPは自動的に設定されますが、カスタマイズしたい場合は… /etc/ntp.conf または、chrony などの代替サービスを使用します。

Crontab とは何ですか? また、どのような構造になっていますか?

Crontabは スケジュールされたタスクの実行ルールを記述するファイル各行(コメントは除く)は「ジョブ」を表します。つまり、ジョブがいつ実行され、どのようなコマンドが実行されるかを表します。通常、各ユーザーはスプールディレクトリに独自のcrontabファイルを持ちます。 / var /スプール/ cron o /var/spool/cron/crontabsディストリビューションによれば。

個人のcrontabを管理するには、次のコマンドを使用します。 crontab いくつかの非常に基本的でありながら強力なオプションを備えています。ファイルは、権限やフォーマットエラーを回避するために、rawエディタで手動で編集するのではなく、このコマンドを使用して編集します。

Crontabの1行の基本構文は、 5つの時間フィールドとコマンド:

m h dom mon dow comando

  • ミヌート (m):0から59までの値。
  • 時間 (h):0から23までの値。
  • 月の日 (日):1日から31日まで。
  • MES (月): 1 から 12 まで、または略称 (システムに応じて Jan、Feb など)。
  • ディアデラセマナ (下): 0 から 6 または 0 から 7。日曜日は 0 (場合によっては 7) になります。
  • コマンド: スクリプトやリダイレクトなど、ターミナルで実行できるすべてのコマンド。

典型的な例は次のようになります。

00 19 * * * /home/usuario/scripts/backup.sh

この行はスクリプトが実行されることを示します 毎日午後7時 (午後 7 時)、日付、月、曜日に関係なく。

crontab

Crontabを作成、編集、リストする方法

個人のタスク ファイルを操作するには、ほとんどの場合、コマンド自体を使用します。 crontab。 アイデアは /var/spool/cron/crontabs内のファイルを手動で編集しないでください。システムによって自動的に管理されるように設計されているためです。

最も一般的な注文は次のとおりです。

  • crontab -eデフォルトのテキストエディタでcrontabを開きます(多くのディストリビューションで) 活力 o ドワーフ) を使用してエントリを作成または変更します。
  • crontab -l: ユーザーに対してスケジュールされているすべてのタスクを画面に表示します。
  • crontab -rcrontab 全体を削除します。これは元に戻せない操作です。 -i を追加しないと確認を求められません.
  • crontab -i -r: crontab を削除する前に確認を求めます。
  • crontabファイル: 現在の crontab を指定されたファイルの内容に置き換えます。
  • crontab-uユーザー: 別のユーザーの crontab を管理します (root または権限を持つユーザーのみ)。
  • crontab -c ディレクトリ: これをサポートするシステムでは、crontab が保存されるディレクトリを定義します。

設定をバックアップしたい場合は、次のように簡単な方法で行うことができます。

crontab -l > ~/crontab_backup.txt

後で復元する必要がある場合は、次の手順に従ってください。

crontab ~/crontab_backup.txt

高度な構文: Crontab の特殊文字

Crontabでは、数字に加えて、 構文をより柔軟にする特殊文字これらにより、範囲、リスト、または間隔をコンパクトに表現できるようになります。

  • * (アスタリスク): そのフィールドの「すべての可能な値」を示します。例えば、 * 時間欄 それはすべての時間を意味します。
  • 、 (食べる): 別々のもの 特定の値のリスト。 例: 0 6,18 * * * 6:00と18:00に運行します。
  • - (スクリプト): 定義する 連続範囲。 例: 0 8-17 * * 1-5 月曜日から金曜日までの午前8時から午後5時まで、1時間ごとに運行します。
  • / (スラッシュ): 1つ選択 ステップまたは間隔。 例えば、 */10 * * * * 「10分ごと」を意味します。
  • 範囲/除く (実装によって異なります): 一部のバリアントでは除外値を定義できますが、これはすべての cron ジョブで標準ではありません。

組み合わせて使用​​する典型的な例は次のとおりです。

*/5 2 * * 1-5 /bin/ejecutar/script.sh

この行はコマンドを起動します 月曜日から金曜日までの2時間目(2:00)に5分ごとに運行長い議事録リストを置き換えるコンパクトな方法です。

キャラクター # (パッド) 行の先頭に コメントを追加同じ行にあるその記号の後のすべては無視されます。これは、ジョブが存在する理由を文書化したり、ジョブを削除せずに一時的に無効にしたりするのに最適です。

Crontabのキーワードと時間のショートカット

最も一般的なケースでは、Crontabは 「予約語」形式のショートカット これらはすべての時間フィールドを置き換えます。数字を意識せずに「毎日」や「毎時間」といった情報を取得したい場合に非常に便利です。

  • @リブート: コマンドを実行する システムが起動したら.
  • @年齢 o @毎年: 年1回、相当 0 0 1 1 *.
  • @monthly: 毎月1日午前0時、 0 0 1 * *.
  • @ウィークリー: 週1回、0日目(通常は日曜日)の深夜、 0 0 * * 0.
  • @daily o @midnight: 1日1回、00:00、 0 0 * * *.
  • @毎時: 毎時0分に1回、 0 * * * *.

例えば、スクリプトを実行したい場合 毎時間、十分に:

@hourly /bin/ejecutar/script.sh

メンテナンススクリプトを起動したい場合は 再起動するたびに次のように使用します:

@reboot /ruta/a/mi_script.sh

環境変数とコマンド構文

典型的なエラーの原因は Cronは最小限の環境で実行されます充電されない .bashrc ユーザー環境全体もそうではないので、 PATHは非常に限られている (通常は次のようなものです /usr/bin:/binこれにより、次のようなコマンドが実行されます Python、Git、PHP、またはPip 絶対パスを使用しないと見つかりません。

これを回避するには、次の 2 つのオプションがあります。 常に完全なルートを使用する スクリプト内で(例えば、 /usr/bin/python3 の代わりに python)または crontabの先頭で環境変数を定義します例は次のようになります。

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
HOME=/home/usuario

これらの行はcrontabファイルの先頭に配置されます。 時間フィールドなし以下に宣言する他のジョブにも影響します。また、 ジョブの標準出力とエラー出力が送信される電子メール アドレスを示します。

それを覚えている Crontabのコマンドはすべてのシェル構文を受け入れます出力をファイルにリダイレクトしたり、パイプを使ってコマンドを連結したりすることができます。例えば、 すべてのスクリプト出力をログに保存する:

* * * * * /home/usuario/helloworld.sh >> /var/log/logs.log 2>&1

そしてあなたが望むなら メッセージを完全に無音化し、メールを受信しない その仕事については、 / dev / null:

* * * * * /home/usuario/helloworld.sh >/dev/null 2>&1

出力管理: ログと電子メール

ディストリビューションと設定に応じて、Cron出力はいくつかの方法で処理できます。Oracle Linuxや最小限のDebianなどのシステムでは、メールエージェントがインストールされていない場合、 cron デーモンは出力をログ システムに直接送信します。.

多くの場合、次のようなファイルで cron アクティビティを表示できます。

  • /var/log/cron (Oracle Linux、CentOS、RHEL では一般的です)。
  • / var / log / syslog (Debian および派生版では一般的)。

たとえば、 cronに関連するメッセージのみをフィルタリングする syslog を使用するシステムでは、次のような操作を実行できます。

grep CRON /var/log/syslog

情報は通常は簡潔ですが (時間、ユーザー、コマンド)、何かが実行されているかどうか、または失敗しているかどうかを確認するのに役立ちます。

メール転送エージェント(MTA)をインストールする場合 PostfixまたはSendmailジョブの出力は送信される ユーザーのローカルメールキューに通常は /var/spool/mail/$USER または同様のルートがあり、次のようなツールで読むことができます。 mailx (コマンド mail).

さらに、変数を使用してcronメールの受信者を制御することができます。 crontabの先頭に:

MAILTO="tu.correo@ejemplo.com"

代わりに MAILTO を空白のままにすると、次のようになります。

MAILTO=""

その後 そのcrontabで定義されたジョブのいずれに対してもメールは送信されませんこれは、一定の出力を生成するタスクが多数ある場合に便利です。

crontabの達人

Cronを操作するためのツールとユーティリティ

cron式を手で書くのが苦手な場合は、 間違いを起こさずにルールを生成するのに役立つツール一部は Web サービスであり、その他はグラフィカル アプリケーションです。

  • クロンタブの達人: cron 式を記述する非常に実用的なページです... 人間が読めるテキストでそれが何をするのかを説明するエラーを警告し、一般的な例とヒントを提供します。
  • Cronジョブジェネレーター時間、曜日、間隔などのオプションからcron式を生成するオンラインアシスタント。 事前定義された設定 そしてパーソナライズします。
  • イージークロン: クラウドサービス URLへのHTTPリクエストをスケジュールする 指定された間隔で実行されます。コントロールパネル、ログ、電子メールアラートを備え、Webスクリプト、APIタスクなどを起動するために広く使用されています。
  • KDE クロン (KCron): KDE環境に統合されたグラフィカルツール コマンドラインに触れることなく、cronジョブを作成、変更、削除します。視覚的なインターフェースから時間と日付を選択できます。
  • クロンメーカー: オンラインcron式ジェネレーターは、 Quartzライブラリと統合する (Java 環境で広く使用されています) だけでなく、複雑な組み合わせを理解するのにも役立ちます。

これらのユーティリティはシステム上のCronを置き換えるものではありませんが、 表現の構成部分を簡素化する構文エラーを削減します。

Crontabの種類: システムとユーザー

Linuxでは、スケジュールされたタスク用の設定ファイルには主に2つの種類があります。 システムcrontabユーザーcrontabどちらも非常に類似した構文を使用しますが、管理方法は同じではありません。

El システムのクロナブ、通常は / etc / crontab そして、ファイルには /etc/cron.d通常は ルート権限これは重要なシステムタスク(ログローテーション、データベースメンテナンス、高レベルバックアップタスクなど)に使用され、ユーザーcrontabとは異なり、各行にユーザーフィールドを明示的に組み込んで、 コマンドはどのような ID で実行されますか?.

たくさん ユーザーcrontab 管理されている crontab -e そして保存されている /var/spool/cron/crontabs または同様の場所。 ジョブを送信できるのはユーザーのみです。 (または他のcronジョブを管理できるroot)であり、直接編集すべきではありません。cronを使用できるユーザーを制限するには、以下のファイルを編集します。 /etc/cron.allow y /etc/cron.deny.

CronとCrontabのパフォーマンスへの影響

Cron自体はリソースをほとんど消費しませんが、タスク計画が不十分だと システムパフォーマンスに悪影響を与える問題は通常、cron デーモンではなく、実行するように指示する内容にあります。

多数のタスクを同時に実行するようにスケジュールすると、 CPUとRAMの使用量のピークたとえば、3 つの大きなバックアップ、データベースの再インデックス、およびログ分析スクリプトを同時に実行すると、サーバーの速度が低下することはほぼ確実です。

タスクにネットワーク(リモートコピー、 rcloneによる同期(大量データ送信)を生成することができます 帯域幅の過負荷、レイテンシの増加、ping接続に依存する他のサービスに影響を与えます。

というリスクもあります タスクの競合同じファイルまたはデータベースに対して異なる操作を同時に実行する 2 つのスクリプトは、診断が困難なデータ破損や異常な障害を引き起こす可能性があります。

影響を制限するには、次のようなツールを使用できます。 nice ジョブのCPU優先度を下げる、または cplimit プロセスが消費できる CPU の最大割合を制限するには:

  • CPU優先度が低い:
    0 19 * * * usuario nice -n 19 /ruta/script.sh
  • CPU を 50% に制限します。
    0 19 * * * usuario cpulimit -l 50 /ruta/script.sh

Crontab を日常的なタスク (バックアップ、クリーンアップ、監視) に使用する

Cronの大きな利点の一つは、 マシンの「メンテナンス」を自動化する ほとんど苦労することなく、中期的にはパフォーマンスが向上し、時間が節約されます。

非常に典型的な使用法は 一時ファイル、キャッシュ、空のディレクトリを定期的に消去する特定のパスにある古いファイルや空のファイルを削除するスクリプトを使用すると、スペースを解放し、ファイル システムの断片化を減らすことができます。

もう一つの便利なパターンは システムとアプリケーションの更新をスケジュールする オフピーク時間帯に。例えば、 aptアップデート&& aptアップグレード (またはディストリビューションの同等のもの) を使用すると、日常業務を中断することなくシステムを最新の状態に保つことができます。

また、自動化することもできます 長期間使用されていないアプリケーションを閉じる他のプロセスのためにメモリを解放します。デスクトップ環境やアプリケーションサーバー環境では、これが大きな違いを生む可能性があります。

そしてもちろん、Cronは 監視およびログ記録スクリプトCPU、RAM、ディスク使用量、ネットワーク遅延などを定期的にキャプチャしてログ ファイルに保存し、傾向を分析して、深刻なインシデントになる前にボトルネックを検出します。

CronとCrontabの欠点と限界

Cronは非常に強力なツールですが、すべての問題に完璧な解決策というわけではありません。 知っておく価値のある制限 提供されるものを超えて押し付けないようにするためです。

片側には、 学習曲線Windows のようなグラフィカルな環境やシステムに慣れている場合、cron 式を手動で記述し、ビジュアル インターフェイスなしで作業するのは最初は不安に感じるかもしれません。

一方、CronはUnix/Linuxエコシステムと密接に結びついています。ここで学んだことは、多くのサーバーや類似のシステムで役立つでしょう。 WindowsやmacOSではそのままでは使えません (独自のメカニズムを持っています)。

セキュリティに関しては、 cron設定ファイルは適切に保護されていないこれらは悪意のある実行の入り口となる可能性があります。ユーザーが制御なしにプログラミングできるようにすることは、問題を引き起こす可能性を秘めています。

さらに、クロン 非常に複雑なタスクや依存関係の多いタスクには適していません。エラーフローを高度に処理できず、条件付きロジックによる再試行もできず、分散システムとネイティブに統合できません。そのため、より洗練されたスケジューラやsystemd独自のタイマーが存在します。

また、次のことに留意する必要があります crontabは1分単位の精度しか提供しない1 秒あたり数回、または 1 分未満の間隔で実行する必要がある場合は、スクリプト自体内で他のツールまたはプログラム ループを使用する必要があります。

Cron と Crontab の代替: Anacron、Fcron、hcron、Mcron など

状況によっては、Cronは必ずしも最適ではありません。例えば、常時電源が入っていないノートパソコンやサーバーがある場合、 特定の時間にスケジュールされたジョブが「失われる」可能性がある その時点で機器の電源がオフになっている場合。

このようなケースをカバーするために、次のような代替手段があります。 アナクロン定期的なタスクを実行するように設計されている 機械を常時オンにする必要なくタスクの実行期限時にコンピュータの電源がオフになっていた場合、Anacron は起動後できるだけ早くタスクを起動します。

フクロン これはまた興味深い選択肢です。システムを常にアクティブにする必要がなく、 特定の日付と時刻多くのディストリビューションで手動インストールが必要になるというデメリットはあるものの、柔軟性が高まります。

hcron さらに一歩進んで、 ジョブの整理、機械ネットワークの管理、安全性の向上のためのラベルそれほど人気はありませんが、集中管理が必要な環境には適しています。

マコン (Guileベース)は、タスクスケジューリングを定義するために完全なプログラミング言語に依存している点で異なり、 ジョブの再定義、依存関係の作成、複雑なロジックの処理に関して大きな力を発揮します.

Windows では、代わりに Cron などのソリューションが使用されます。 WinCron、VisualCron、または高度なタスクスケジューラMicrosoft エコシステムに統合されながらも、直感的なグラフィカル インターフェイスと同等の機能を提供します。

ビジネス環境におけるCronとCrontab

あらゆる規模の企業において、CronとCrontabはシステムを稼働させるための「接着剤」のような役割を果たしています。 反復的かつ重要なプロセスを自動化する 人間による継続的な介入がなくなるため、障害のリスクが軽減され、管理者の時間が節約されます。

最も一般的なビジネス用途としては、 スケジュールされたバックアップ、ソフトウェアの更新、定期的なレポートの生成、データベースのメンテナンスタスク、ログのクリーンアップ構文の細分性により、アクションが実行されるタイミングを微調整して影響を最小限に抑えることができます。

さらに、これらの自動化は直接的な影響を及ぼします。 効率と生産性従業員は日常的なプロセスを開始することを覚えておく必要がなくなり、人的エラーが削減され、負荷の低いウィンドウを負荷の高い操作の実行に有効活用できるようになります。

しかし、ビジネス環境では、 スケジュールされたジョブをすべて徹底的に文書化し、crontab のバックアップを維持し、定義されている内容が引き続き意味をなしているかどうかを定期的に確認します。時間が経つにつれて、何も貢献せずにリソースを消費し続ける古いタスクが蓄積されやすくなります。

結局、CronとCrontabは一種の システムの「自動スケジュール」賢く使用すれば、小規模なサーバーでも、多数のマシンを備えた大規模なインフラストラクチャでも、これらは不可欠なものとなり、より高度なオーケストレーションや監視ツールを構築するための強固な基盤を維持できるようになります。

以上のことを踏まえると、 LinuxでCrontabを使ってタスクをスケジュールすることは、システムを自動化する最もシンプルで強力な方法の1つです。適切に記述された数行で、制限を尊重し、権限を管理し、環境を制御し、パフォーマンスとセキュリティへの影響を慎重に計画する限り、ボタンに触れることなく、バックアップ、クリーニング、更新、監視、ビジネス プロセスを処理できます。

外付けドライブへの自動バックアップ
関連記事
自動バックアップ: 外付けドライブ上のデータを保護します

優先ソースとして追加