crontab でスケジュールされたタスクが実行されない理由の概要

crontab でスケジュールされたタスクが実行されない理由の概要

序文

最近、仕事でいくつかの問題が発生しました。crontab でスケジュールされたタスクが実行されませんでした。後でオンラインで検索したところ、主な理由は次のとおりです。

1 crondサービスが開始されていません

Crontab は Linux カーネルの機能ではありませんが、開始および停止できる crond サービスに依存しています。停止している場合は、スケジュールされたタスクを実行できません。解決策は、オンにすることです。

クロン

または

サービスcrond開始

crond コマンドが存在しないというメッセージが表示される場合は、誤って削除された可能性があります。次のコマンドを使用して CentOS で再インストールできます。

yum -y crontabsをインストール

2. 権限の問題

たとえば、スクリプトに x 実行権限がない場合、解決策は次のようになります。

実行権限を追加するか、bash abc.shを使用して実行します

また、crontab タスクが属するユーザーが特定のディレクトリへの書き込み権限を持っていない場合にも、タスクが失敗する可能性があります。

3 パス問題

一部のコマンドはシェルでは正常に実行されますが、crontab で実行すると常に失敗します。 crontabが使用するshがパスを正しく識別していないことが原因である可能性があります。たとえば、シェルにrootとしてログインし、/root/test.shを実行した後、

./test.sh

それでおしまい。しかし、crontab ではこのスクリプトは見つかりません。たとえば、完全なスクリプトを記述します。

ルートディレクトリ

4. 時間差の問題

サーバーとクライアントの間には時間差があるため、crontab の時間はサーバーの時間に基づきます。

時差は本当にイライラします。私自身も経験しました。現象は次のようになります。

(1)スケジュールされたスクリプトを設定し、dateコマンドを使用してサーバーの時間を監視しました。スクリプトが実行されたとき、スクリプトは実行されませんでした。

(2)しかし、スクリプトを1分ごとに実行するように設定し、問題なく動作する。

しまった、サーバーの時間は正しいのか?タイムゾーンを追加する必要がありますか?そこで、スクリプトの時間を 10 時間、12 時間、または 8 時間短縮しようとしましたが、うまくいきませんでした。

しかし、実行されない原因は時間の不整合であることは明らかです。

最終的に、次の 2 行で問題は解決されました。

cp /usr/share/zoneinfo/アジア/上海 /etc/localtime
サービスcrondの再起動

こちらの記事を参照してください: https://www.jb51.net/article/154296.htm

5. 変数の問題

コマンドに変数が含まれていても、実行時に crontab に変数が含まれていないことがあり、これによっても実行が失敗する可能性があります。

検証後、スケジュールされたスクリプト test.sh は上記のいずれの理由でも実行されませんでした。実際、私のスクリプトは 1 つの文だけです。

#!/bin/bash
エコー 123 >> テストファイル

このように設定したタイミングスクリプトをテストしたいのですが、スクリプトを1分ごとに実行するように設定しましたが、スクリプトが配置されているディレクトリにファイルが見つかりません。手動で実行します。

# sh テスト.sh

しかし、このファイルはスクリプトが配置されているディレクトリで確認できます

crontabがまったく実行されていないのではないかと疑ったので、crontabに直接追加しました

*/1 * * * * エコー 123 >> /home/denglinjie/testFile

testFile ファイルが生成され、crontab が実行されたことを示しているので、スクリプト自体に問題があるようです。

最後に、testFileのフルパスをここに記述する必要があることがわかりました。私は単純に、testFileはスクリプトが配置されているディレクトリに生成されると考えていたため、次の形式に変更しました。

#!/bin/bash
エコー 123 >> /data/denglinjie/testFile

そしてそれは機能します。

実際、パスは間違いやすい場所です。/home/denglinjie ディレクトリにスクリプト ファイル test1.sh があり、同じディレクトリにスクリプト ファイル test2.sh があるとします。

test2.sh は test1.sh 内で実行され、相対パス、つまり test1.sh を基準としたパスが使用されます。

crontab -eで編集する場合、実行方法は

sh /home/denglinjie/test1.sh。sh test2.sh を呼び出すと、システムは crontab ファイルがあるディレクトリで test2.sh を探していると認識しますが、見つからないため実行が失敗します。

最初は、実行するために書いたスクリプト ファイルと、他の呼び出されるスクリプトおよび crontab ファイルを 1 か所に置いて、それらをプルできるようにしようと思いましたが、権限の問題のためか、/var/spool/cron ディレクトリに入ることができず、失敗しました。

したがって、別の解決策は、スクリプトを実行する前にcd /home/denglinjieコマンドを使用してスクリプトが配置されているディレクトリに入ることです。

------------------------------------------------------------------

最近、crontabが実行されない新たな理由が発見されました。

ここで実行したいのは Python スクリプトです。Python スクリプトのディレクトリは次のとおりです。

/data/denglinjie/work/UpdateModuleSwitch

当初、スケジュールされたタスクは次のように書かれていました。

0 * * * * cd /data/denglinjie/work/UpdateModuleSwitch;python update_switch.py

時点では実行されていないことがわかりました。update_switch.py​​の内容の一部は以下のとおりです。

pymongoをインポートする

つまり、スクリプトにインストールした pymongo を導入しました。この pymongo は指定された python バージョンにインストールされていることに注意してください。

実行されない理由: crontab スケジュールタスクが実行されると、使用される Python が私の Python ではなく、使用される Python に pymongo がインストールされていないため、インポートに失敗します。

解決策は、次の形式に変更することです。

0 * * * * cd /data/denglinjie/work/UpdateModuleSwitch;/data/zhoumi/install_evn/bin/python update_switch.py

実行する Python プログラムを指定します。この Python プログラムには pymongo がインストールされ、バインドされています。または、次の形式を使用します。

0 * * * * エクスポート PATH=/data/zhoumi/install_evn/bin/:$PATH;cd /data/denglinjie/work/UpdateModuleSwitch;python update_switch.py

私の Python は自分のユーザー ディレクトリにインストールされているため、システムはこの Python を見つけることができません。そのため、システムの PATH 環境変数に Python を追加するだけで済みます。

要約する

上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。

以下もご興味があるかもしれません:
  • Linux Crontab を使用して PHP スクリプトを定期的に実行する方法
  • Linuxはcrontabを使用してPHP実行計画のタイミングタスクを実装します
  • CentOS 7 で crontab を使用して定期的にタスクを実行する方法の詳細な説明
  • Linux で crontab を使用してスケジュールされたタスクを 1 秒に 1 回実行する方法
  • Linux でタスクを定期的に実行する方法と crontab の使用方法の説明 (収集およびソート済み)
  • Linuxでcrontabスケジュールタスクが実行されない理由
  • Crontab コマンドを使用して Ubuntu システムで PHP ファイルを定期的に実行する詳細な説明
  • Linux でタスクをスケジュール実行するための at コマンドと crontab コマンドの詳細な説明
  • Linux での crontab スケジュール実行コマンドの詳細な説明
  • 特定のコマンドを実行する必要があるときにシェル スクリプトの実行をタイミングする Linux crontab のソリューション

<<:  MySql インデックスの詳細な紹介と正しい使用方法

>>:  Mybatisの特殊文字処理の詳細な説明

推薦する

MYSQLが中国語を認識できない問題の恒久的な解決策

ほとんどの場合、MySQL はインストールしたばかりのときは中国語をサポートしません。これはエンコー...

Mysql InnoDBとMyISAMの違いの分析

MySQL は、myisam、innodb、memory、archive、example など、多く...

Linux (CentOS) システムで MySQL データベース ディレクトリの場所を変更する方法

CentOS システムで MySQL データベース ディレクトリの場所を変更する方法1. まず、My...

MySQLを定期的にバックアップしてQiniuにアップロードする方法

ほとんどのアプリケーション シナリオでは、緊急時に備えて重要なデータをバックアップし、安全な場所に保...

MySQL の null 可能フィールドは NULL に設定する必要がありますか、それとも NOT NULL に設定する必要がありますか?

MySQL を頻繁に使用する人は、次のような状況に遭遇する可能性があります。 1. フィールド タ...

mysql 8.0.12 winx64 のダウンロードとインストールのチュートリアル

MySQL 8.0.12のダウンロードとインストールのチュートリアルは参考までに、具体的な内容は次の...

Dockerコンテナ内でホストDocker操作を呼び出して実行する

まず、この投稿は Docker 初心者向けです。もちろん、ベテランであれば記事中の分割線以降の操作方...

MySQL 8.0.17 winx64 (Navicat 付き) 手動構成バージョンのインストール チュートリアル図

1. ダウンロードアドレス: mysql-8.0.17-winx64ダウンロードして解凍する2. フ...

JS 正規マッチングの落とし穴の記録

最近、JS の正規表現マッチングの落とし穴を発見したのですが、その時はあまりにも奇妙だったので、何か...

CocosCreatorでJSZip圧縮を使用する方法

CocosCreator バージョン: 2.4.2 jszipの実践的なプロジェクトアプリケーション...

WeChatアプレットはシンプルなチャットルームを実装します

この記事では、WeChatアプレットの具体的なコードを共有し、簡単なチャットルームを実装します。具体...

JSにおける合同と不等式、等式と不等式の問題について

目次一致と不一致一致するすべてが平等ではない平等と不平等等しい等しくない一致と不一致シンボルの両側の...

ウェブページのフッターで注意すべきことのまとめ

たくさんのリンクおそらく、このようなサイトをたくさん見たことがあるでしょう。ページの下部に 50 個...

CentOS7で新しいデータディスクをマウントするための完全な手順

序文新しい VPS を購入しました。新しい VPS のデータ ディスクはデフォルトではシステムにマウ...

Reactフックの仕組み

目次1. React フックと純粋関数2. シンプルなmyUseState 3. myUseStat...