Linux の crontab について知らないこと
実際の作業では、crontab によってさまざまな問題が発生する可能性があります。以下では、特定の作業において crontab で発生しやすい問題とその解決方法について詳しく説明します。
1. crontabの機能
crond は、Linux でタスクを定期的に実行したり、特定のイベントが処理されるのを待機したりするために使用されるデーモン プロセスです。これは、Windows のスケジュールされたタスクに似ています。オペレーティング システムがインストールされると、このサービス ツールがデフォルトでインストールされ、crond プロセスが自動的に開始されます。 crond プロセスは、実行すべきタスクがあるかどうかを 1 分ごとに定期的に確認し、実行すべきタスクがある場合には自動的にタスクを実行します。
Linux でのタスク スケジューリングは、システム タスク スケジューリングとユーザー タスク スケジューリングの 2 つのカテゴリに分類されます。
- システム タスク スケジューリング: キャッシュされたデータのハードディスクへの書き込み、ログのクリーニングなど、システムが定期的に実行するタスク。
- ユーザータスクのスケジュール設定: ユーザーデータのバックアップ、定期的な電子メールリマインダーなど、ユーザーが定期的に実行する必要があるタスク。ユーザーは crontab ツールを使用して、スケジュールされたタスクを独自にカスタマイズできます。ユーザー定義の crontab ファイルはすべて、ユーザー名と同じファイル名で /var/spool/cron ディレクトリに保存されます。
crontab は、実際のエンタープライズ アプリケーションで非常に広く使用されており、一般的な用途には、スケジュールされたデータ バックアップ、スケジュールされたシステム検出、スケジュールされたデータ収集、スケジュールされた構成の更新、スケジュールされたレポートの生成などが含まれます。
2. Crontab アプリケーションの例
1. Crontab の使用形式
一般的に使用される crontab の形式は次のとおりです:
リーリーオプションの意味は次のとおりです:
- -u user: 特定のユーザーの crontab サービスを設定するために使用されます。たとえば、「-u ixdba」は、ixdba ユーザーの crontab サービスを設定することを意味します。このパラメータは通常、root ユーザーによって実行されます。
- file: file はコマンド ファイルの名前です。これは、そのファイルが crontab のタスク リスト ファイルとして使用され、crontab にロードされることを意味します。このファイルがコマンドラインで指定されていない場合、crontab コマンドは標準入力 (キーボード) に入力されたコマンドを受け入れ、それらを crontab にロードします。
- -e: ユーザーの crontab ファイルの内容を編集します。ユーザーが指定されていない場合は、現在のユーザーの crontab ファイルを編集することを意味します。
- -l: 特定のユーザーの crontab ファイルの内容を表示します。ユーザーが指定されていない場合は、現在のユーザーの crontab ファイルの内容を表示します。
- -r: /var/spool/cron ディレクトリからユーザーの crontab ファイルを削除します。ユーザーが指定されていない場合は、デフォルトで現在のユーザーの crontab ファイルが削除されます。
- -i: ユーザーの crontab ファイルを削除するときに確認プロンプトを表示します。
2. crontab ファイルの構文
ユーザーが作成した crontab ファイルでは、各行がタスクを表し、各行の各フィールドが設定を表します。その形式は 6 つのフィールドに分かれています。最初の 5 つのセグメントは時間設定セグメントです。6 番目のセグメントは実行するコマンドセグメント。形式は次のとおりです:
リーリー ###で:### #「」 ? 分: 分を表し、0 ~ 59 の任意の整数を指定できます。
? 時間: 時間を示します。0 ~ 23 の任意の整数を指定できます。? day: 日付を表し、1 ~ 31 の任意の整数を指定できます。
? month: 月を示します。1 ~ 12 の任意の整数を指定できます。
? week: 曜日を示します。0 ~ 7 の任意の整数を指定できます。0 または 7 は日曜日を表します。
? コマンド: 実行するコマンドは、システムコマンドまたは自分で作成したスクリプトファイルです。
」
#上記の各フィールドでは、次の特殊文字も使用できます:
“
? 星号():代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
? 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
? 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
? 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如/10,如果用在minute字段,表示每十分钟执行一次。
”
3、几个crontab例子
0 /3 /usr/local/apache2/apachectl restartログイン後にコピー表示每隔3个小时重启apache服务一次。
30 3 6 /webdata/bin/backup.shログイン後にコピー表示每周六的3点30分执行/webdata/bin/backup.sh脚本的操作。
0 0 1,20 fsck /dev/sdb8ログイン後にコピー表示每个月的1号和20号检查/dev/sdb8磁盘设备。
10 5 /5 * echo "">/usr/local/apache2/log/access_logログイン後にコピー表示每个月的5号、10号、15号、20号、25号、30号的5点10分执行清理apache日志操作。
三、系统级任务调度/etc/crontab
在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
/etc/crontab文件包括下面几行:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthlyログイン後にコピー从上面的示例文件可看出,crontab的任务列表主要由两部分组成:环境变量配置与定时任务配置。可能大家在工作中更多是只用到了任务配置部分。
前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。第六至九行就是crontab执行格式的具体写法。
四、crontab调试解析神器
通常在使用crontab添加任务时,我们会依靠自己已有知识编写定时语句。当需要测试语句是否正确时,还需要在服务器上不断调试,,这种方式太不高效了。有没有一款工具,只要我们给出语句,就能告诉具体执行时间以及对错呢?还真有,下面介绍一款老外开发的crontab在线解析工具。
工具地址:https://crontab.guru
给出这个工具的截图如下:
好用不好用,你试试就知道。
五、crontab使用的各种坑
1、环境变量问题
当我们刚使用crontab时,运维老鸟们一般会告知所有命令尽量都使用绝对路径,以防错误。这是为什么?这就和我们下面要谈的环境变量有关了。
首先,获取shell终端环境变量,内容如下:
[root@SparkWorker1 dylogs]# env XDG_SESSION_ID=1629 HOSTNAME=SparkWorker1 TERM=linux SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=172.16.213.132 50080 22 HADOOP_PREFIX=/opt/hadoop/current CATALINA_BASE=/opt/hadoop/current/share/hadoop/httpfs/tomcat SSH_TTY=/dev/pts/1 QT_GRAPHICSSYSTEM_CHECKED=1 USER=root MAIL=/var/spool/mail/root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/java/default/bin:/opt/hadoop/current/bin:/opt/hadoop/current/sbin:/root/bin PWD=/data/dylogs LANG=zh_CN.UTF-8 HOME=/rootログイン後にコピー要获取crontab环境变量信息,可以设置如下计划任务:
* * * * * /usr/bin/env > /tmp/env.txtログイン後にコピー等待片刻,env.txt输出内容如下:
[root@SparkWorker1 dylogs]# cat /tmp/env.txt XDG_SESSION_ID=1729 SHELL=/bin/sh USER=root PATH=/usr/bin:/bin PWD=/root LANG=zh_CN.UTF-8 SHLVL=1 HOME=/root LOGNAME=root XDG_RUNTIME_DIR=/run/user/0 _=/usr/bin/envログイン後にコピー从上面输出结果可知,shell命令行的PATH值为
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/java/default/bin:/opt/hadoop/current/bin:/opt/hadoop/current/sbin:/root/binログイン後にコピー而crontab中的PATH值为:
PATH=/usr/bin:/binログイン後にコピー对比crontab环境变量与shell终端环境变量的输出,可以发现两者的差异很大。大家可能遇到过,在shell命令行执行脚本都没有问题,而放到crontab后却执行异常,或者执行失败,此时,我们就需要考虑是否命令涉及的环境变量在crontab和shell命令行间存在差异。
例如,我们在crontab中执行了如下定时任务:
20 16 * * * php autosave.phpログイン後にコピー而如果我们的php是安装在/usr/local/bin/目录下的话,那么上面这个定时任务由于无法找到php命令,会运行失败。
那么,知道了环境变量问题,可能导致计划任务无法正常执行,怎么才能避免这个问题呢,这个交给大家一个终极大招,可以在crontab中加入如下配置,保证你的计划任务执行不会出现环境变量问题:
* * * * * source /$HOME/.bash_profile && commandログイン後にコピー这个其实是在执行计划任务命令之前,先加载了用户环境变量信息,由此可保证所有环境变量都可正常加载。
2、定时时间配置误区
时间是crontab的核心,稍微配置不当,就会出现问题,先看在整点时间设置时可能出现的错误,例如,设定每天2点执行一次任务,很多朋友可能这么写过:
* 2 * * * commandログイン後にコピー很明显,这个时间写法是错误的,当我们听到每天2点执行一次某任务时,很多人会把重点放在2点,而忽略了执行一次的需求。上面这个定时任务他会在2点开始执行,每分钟执行一次,总共执行60次。
正确的写法应该是这样的:
0 2 * * * commandログイン後にコピー这个才表示每天2点0分执行command对应的任务。
3、特殊符号%问题
%在crontab中是特殊符号,具体含义如下:
第一个%表示标准输入的开始,其余%表示换行符,看下面两个例子:
* * * * * cat >> /tmp/cat.txt 2>&1 % stdin outログイン後にコピー查看/tmp/cat.txt的内容为:
stdin outログイン後にコピー再看下面这个例子:
* * * * * cat >> /tmp/cat1.txt 2>&1 % stdin out 1 % stdin out 2 % stdin out 3ログイン後にコピー查看 /tmp/cat1.txt的内容如下:
stdin out 1 stdin out 2 stdin out 3ログイン後にコピー有输出内容可知,第一个%表示标准输入的开始,其余%表示换行符。
既然”%”是特殊字符,那么在crontab中使用时,就要特别注意,怎么使用这些特殊字符呢,很明显,使用转移字符即可,例如:
* * * * * cat >> /tmp/cat2.txt 2>&1 % Special character escape \%.ログイン後にコピー查看输出/tmp/cat2.txt 输出内容如下:
Special character escape %.ログイン後にコピー可以看到,执行成功了,并成功避开这个坑了。
4、关于crontab的输出重定向
在crontab执行的计划任务中,有些任务如果不做输出重定向,那么原本会输出到屏幕的信息,会以邮件的形式输出到某个文件中,例如,执行下面这个计划任务:
* * * * * /bin/dateログイン後にコピー这个计划任务是没有做输出重定向的,他的主要用途是输出时间,由于没有配置输出重定向,那么这个时间信息默认将以邮件的形式输出到/var/spool/mail/$USER(这个$USER对应的是系统用户,这里是root用户)文件中,大致内容如下:
From root@SparkWorker1.localdomain Fri Sep 21 12:58:02 2022 Return-Path: X-Original-To: root Delivered-To: root@SparkWorker1.localdomain Received: by SparkWorker1.localdomain (Postfix, from userid 0) id F2745192AE; Fri, 21 Sep 2022 12:58:01 +0800 (CST) From: "(Cron Daemon)" To: root@SparkWorker1.localdomain Subject: Cron /bin/date Content-Type: text/plain; charset=UTF-8 Auto-Submitted: auto-generated Precedence: bulk X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: X-Cron-Env: Message-Id: Date: Fri, 21 Sep 2022 12:58:01 +0800 (CST) 2022年 09月 21日 星期五 12:58:01 CSTログイン後にコピー由此可见,输出内容还是很多的,如遇到任务有大量输出的话,会占用大量磁盘空间,显然,这个邮件输出最好关闭,怎么关闭呢,只需设置MAILTO环境变量为空即可,上面的计划任务,可做如下修改:
MAILTO="" * * * * * /bin/dateログイン後にコピー这样,就不会发邮件信息到/var/spool/mail/$USER下了,但是问题并没有彻底解决,关闭mail功能后,输出内容将继续写入到/var/spool/clientmqueue中,长期下去,可能占满分区的inode资源,导致任务无法执行。
为了避免此类问题发生,建议任务都加上输出重定向,例如,可以在crontab文件中设置如下形式,忽略日志输出:
0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1ログイン後にコピー其中,“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。
5、调试crontab问题的一般思路
要解决crontab相关异常问题,可按照如下思路进行调试:
(1)、通过/var/log/cron日志确认任务是否执行
(2)、如未执行则分析定时语句,是否是环境变量问题、特殊字符问题、时间配置问题、权限问题等。
(3)、确认crond服务开启,如果定时语句也正确,检查crond服务是否开启。
Systemd方式(centos7及以上)
[root@SparkWorker1 spool]# systemctl status crond.serviceログイン後にコピーSysVinit方式(centos7以下)
[root@SparkWorker1 spool]# service crond statusログイン後にコピー(4)确认定时任务中命令是否执行成功
这个问题可通过输出获取错误信息进行调试,方法就是利用重定向获取输出,然后进行分析。举例如下:
* * * * * python /usr/local/dyserver/dypos.py >> /tmp/dypos.log 2>&1ログイン後にコピー通过加上“/tmp/dypos.log 2>&1”,就可以很快定位问题,因为这个dypos.py脚本在执行的时候会把错误信息都输出到dypos.log 中,接着查看dypos.log文件,问题一目了然:
[root@SparkWorker1 spool]# cat /tmp/dypos.log /bin/sh: python: 未找到命令 /bin/sh: python: 未找到命令ログイン後にコピー显示python命令没有找到,很明显的就可以确定是环境变量的问题。这种方式定位问题非常有效。
以上がLinux の crontab について知らないことの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











VSコードシステムの要件:オペレーティングシステム:オペレーティングシステム:Windows 10以降、MACOS 10.12以上、Linux Distributionプロセッサ:最小1.6 GHz、推奨2.0 GHz以上のメモリ:最小512 MB、推奨4 GB以上のストレージスペース:最低250 MB以上:その他の要件を推奨:安定ネットワーク接続、XORG/WAYLAND(Linux)

VSコード拡張機能のインストールの理由は、ネットワークの不安定性、許可不足、システム互換性の問題、VSコードバージョンが古すぎる、ウイルス対策ソフトウェアまたはファイアウォール干渉です。ネットワーク接続、許可、ログファイル、およびコードの更新、セキュリティソフトウェアの無効化、およびコードまたはコンピューターの再起動を確認することにより、問題を徐々にトラブルシューティングと解決できます。

NotePadはJavaコードを直接実行することはできませんが、他のツールを使用することで実現できます。コマンドラインコンパイラ(Javac)を使用してByteCodeファイル(filename.class)を生成します。 Javaインタープリター(Java)を使用して、バイトコードを解釈し、コードを実行し、結果を出力します。

VSコードはMacで利用できます。強力な拡張機能、GIT統合、ターミナル、デバッガーがあり、豊富なセットアップオプションも提供しています。ただし、特に大規模なプロジェクトまたは非常に専門的な開発の場合、コードと機能的な制限がある場合があります。

Linuxシステムの5つの基本コンポーネントは次のとおりです。1。Kernel、2。Systemライブラリ、3。Systemユーティリティ、4。グラフィカルユーザーインターフェイス、5。アプリケーション。カーネルはハードウェアリソースを管理し、システムライブラリは事前コンパイルされた機能を提供し、システムユーティリティはシステム管理に使用され、GUIは視覚的な相互作用を提供し、アプリケーションはこれらのコンポーネントを使用して機能を実装します。

VSコードは、Microsoftが開発した無料のオープンソースクロスプラットフォームコードエディターと開発環境であるフルネームVisual Studioコードです。幅広いプログラミング言語をサポートし、構文の強調表示、コード自動完了、コードスニペット、および開発効率を向上させるスマートプロンプトを提供します。リッチな拡張エコシステムを通じて、ユーザーは、デバッガー、コードフォーマットツール、GIT統合など、特定のニーズや言語に拡張機能を追加できます。 VSコードには、コードのバグをすばやく見つけて解決するのに役立つ直感的なデバッガーも含まれています。

Visual Studio Code(VSCODE)は、Microsoftが開発したクロスプラットフォーム、オープンソース、および無料のコードエディターです。軽量、スケーラビリティ、および幅広いプログラミング言語のサポートで知られています。 VSCODEをインストールするには、公式Webサイトにアクセスして、インストーラーをダウンロードして実行してください。 VSCODEを使用する場合、新しいプロジェクトを作成し、コードを編集し、コードをデバッグし、プロジェクトをナビゲートし、VSCODEを展開し、設定を管理できます。 VSCODEは、Windows、MacOS、Linuxで利用でき、複数のプログラミング言語をサポートし、マーケットプレイスを通じてさまざまな拡張機能を提供します。その利点には、軽量、スケーラビリティ、広範な言語サポート、豊富な機能とバージョンが含まれます

gitリポジトリアドレスを表示するには、次の手順を実行します。1。コマンドラインを開き、リポジトリディレクトリに移動します。 2。「git remote -v」コマンドを実行します。 3.出力と対応するアドレスでリポジトリ名を表示します。
