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の特殊文字処理の詳細な説明

推薦する

プライベートレジストリ内の画像を照会または取得する方法

Dockerはプライベートレジストリ内のイメージを照会または取得するために、 docker 検索 1...

マウス追従ゲームを実現するjs

この記事では、マウス追従ゲームを実装するためのjsの具体的なコードを参考までに共有します。具体的な内...

UbuntuはCUDAの複数のバージョンをインストールし、いつでも切り替えることができます

CUDA とは何かを紹介するのではなく、複数の CUDA バージョンの共存とリアルタイム切り替えをど...

一般的な Linux ディストリビューションのミラーソース構成の概要

最近 Linux を研究していて、いくつかの Linux ディストリビューションを試してみましたが、...

MySQL 5.7.27 のダウンロード、インストール、設定に関する詳細なチュートリアル

目次1. ダウンロード手順2. 環境変数を設定する3. my.iniファイルを設定する4. MySQ...

CSS で「プラス記号」効果を実装するためのサンプルコード

以下に示すプラス記号の効果を実現するには: この効果を実現するには、div 要素だけが必要です。 b...

MySQL レプリケーションの原理と実際のアプリケーションの詳細な説明

この記事では、例を使用して、MySQL レプリケーションの原理と実際のアプリケーションについて説明し...

SQL GROUP BYの詳細な説明と簡単な例

GROUP BY ステートメントは、Aggregate 関数と組み合わせて使用​​され、1 つ以上の...

CSS マルチレベルメニュー実装コード

これは、Web ページを Windows のスタート メニューなどのデスクトップ プログラムのように...

MySQL デッドロック シナリオ例の分析

序文最近、MySQL で RR レベルでデッドロック問題に遭遇しました。興味深いと思ったので、調べて...

HTML ベース URL タグ

その機能はグローバル スタイルを設定することです。その後の相対パスはこれに基づきます: <im...

JavaScript での実行コンテキストと実行スタックの例の説明

JavaScript - 原則シリーズ日常の開発では、既存のプロジェクトを引き継ぐときは常に、まず他...

nginx 用の zabbix 5.0 をインストールして展開する方法

目次実験環境インストールと展開データベースをインストールして設定します (ここでは mariadb ...

MySQL のキーとインデックスの違い

まずはコードを見てみましょう: ALTER TABLE reportblockdetail ADD ...

CSSで記事の区切り線のスタイルを実装するさまざまな方法のまとめ

この記事では、CSS で記事の区切り線を実装するさまざまな方法をまとめています。区切り線はページを美...