Linux で crontab 出力リダイレクトが有効にならない問題の解決方法

Linux で crontab 出力リダイレクトが有効にならない問題の解決方法

質問

LINUX では、定期的なタスクは通常、cron デーモン プロセス [ps -ef | grep cron] によって処理されます。 Cron は、コマンド ラインとそれが呼び出される時刻を含む 1 つ以上の構成ファイルを読み取ります。

cron 設定ファイルは「crontab」と呼ばれ、「cron table」の略です。

最近、スケジュールされたタスクが crontab に追加されました。タスクが実行されると、デフォルトで通常の出力が行われます。タスク実行中の例外情報も取得して問題の特定を容易にするために、crontab に次のようなコマンドを記述しました。

01 09 * * * cd /opdir/test/ && ./test.sh &>>test.log

上記のコマンドは非常に分かりやすいです。毎日 9:01 に test.sh スクリプトを実行し、スクリプトの標準エラー出力と標準出力をファイル test.log にリダイレクトします。最終的に、スクリプトは正常に実行されましたが、ログ ファイル test.log には内容がなかったことがわかりました。

この問題を解決して説明するために、まず Linux システムにおけるリダイレクトの問題について簡単に説明しましょう。

コンセプト

リナックス:

1: 標準出力 (stdout) を示し、デフォルトで画面に出力されます。

2: 標準エラー出力 (stderr) を示します。これはデフォルトで画面に出力されます。

通常、スクリプトの実行結果をリダイレクトするには、次の方法がよく使用されます。

bash test.sh >test.out // スクリプトの標準出力はファイル test.out に書き込まれ、標準エラー出力は画面に直接表示されます。次と同等: bash test.sh 1>test.out
bash test.sh >test.out 2>&1 //標準出力と標準エラーは両方とも test.out に書き込まれ、お互いを上書きしません。これは bash test.sh &>test.out と同等です。
bash test.sh >test.out 2>test.out //標準出力と標準エラー出力の両方がtest.outに書き込まれるため、お互いが上書きされる可能性があります。使用は推奨されません。bash test.sh &>test.out //2番目の方法と同等

上記の効果を比較してください。

最初のタイプ: エラー出力は画面上に表示され、通常の出力はファイル test.out にあります。

root@mengalong:~/opdir/mengalong/t/t# cat test.sh
#!/bin/bash
t
日付

root@mengalong:~/opdir/mengalong/t/t# bash test.sh >test.out
test.sh: 行 2: t: コマンドが見つかりません
root@mengalong:~/opdir/mengalong/t/t# cat test.out
2018年10月31日水曜日 11:07:24 CST

2番目のタイプ: エラー出力と通常出力の両方がファイルtest.outにリダイレクトされます。

root@mengalong:~/opdir/mengalong/t/t# bash test.sh >test.out 2>&1
root@mengalong:~/opdir/mengalong/t/t# cat test.out
test.sh: 行 2: t: コマンドが見つかりません
2018年10月31日水曜日 11:09:02 CST

3番目のタイプ:エラー出力と通常出力が互いにカバーし合う

root@mengalong:~/opdir/mengalong/t/t# bash test.sh >test.out 2>test.out
root@mengalong:~/opdir/mengalong/t/t# cat test.out
2018年10月31日水曜日 11:10:36 CST
見つからない

4番目は特別なケースで、bash test.sh 2>&1 >test.out と bash test.sh >test.out 2>&1 の違いを比較します。

root@mengalong:~/opdir/mengalong/t/t# bash test.sh 2>&1 >test.out
test.sh: 行 2: t: コマンドが見つかりません
root@mengalong:~/opdir/mengalong/t/t# cat test.out
2018年10月31日水曜日 11:12:13 CST

ここでは、>test.out の前に 2>&1 を置いただけですが、結果は期待したものとは異なります。エラーと通常の出力の両方が test.out ファイルに出力されます。これは、bash test.sh 2>&1 >test.out コマンドにおいて、2>&1 はエラー出力を標準出力にリダイレクトするだけであり、このときの標準出力のデフォルト値は画面であるため、実際には標準エラー出力がファイルではなく画面にリダイレクトされているのと同じになります。したがって、リダイレクトのシーケンスを考慮する必要があります。

問題解決

次に、私が書いた crontab タスクを振り返ってみましょう。

01 09 * * * cd /opdir/test/ && ./test.sh &>>test.log

上記概念分析によれば、この書き方は ./test.sh >test.log 2>&1 と同等であるはずです。スクリプト実行の出力と標準エラー出力はすべて test.log にリダイレクトされます。しかし、実際の状況は、test.log ファイルには何も存在しません。

これは、crontab が使用するデフォルトのシェル環境が /bin/sh であり、/bin/sh が &>>test.log のリダイレクト方法をサポートしていないため、test.log にコンテンツが存在しないという結果になるからです。

したがって、この問題の解決策は、crontab のリダイレクト方法を変更することです。

01 09 * * * cd /opdir/test/ && ./test.sh >>test.log 2>&1

アドバイス

crontab の実行中にスクリプトの出力がリダイレクトされない場合、デフォルトでシステム ユーザーに電子メールが送信されます。電子メールの内容は通常、/var/mail/$user に保存されます。クリーンアップされない場合、サーバーのルート パーティションがいっぱいになり、最終的にマシンがログインできなくなります。したがって、推奨される crontab コマンドは次のとおりです。

01 09 * * * cd /opdir/test/ && ./test.sh >>test.log 2>&1 </dev/null &

具体的には、最後に </dev/null & が追加されます。この意味については詳しく説明しません。興味のある方はご自身で解析してみてください。

要約する

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

以下もご興味があるかもしれません:
  • Linux crontab スケジュールタスクの設定方法(詳細説明)
  • Linux Crontab を使用して PHP スクリプトを定期的に実行する方法
  • Linuxはcrontabを使用してPHP実行計画のタイミングタスクを実装します
  • Linux crontab の例の分析
  • Linux での crontab スケジュール バックアップの例を使用した MySQL スケジュール バックアップ
  • Linux で crontab を使用してスケジュールされたタスクを 1 秒に 1 回実行する方法
  • Linux でタスクを定期的に実行する方法と crontab の使用方法の説明 (収集およびソート済み)
  • Python crontab を使用して Linux のスケジュールされたタスクを設定する詳細な説明
  • Linux の入力と出力のリダイレクトの詳細な説明
  • Linuxの入力および出力リダイレクトを使用するための詳細な手順

<<:  JavaScriptのプリコンパイルを見てみましょう(概要)

>>:  NavicatでMySQLビッグデータをインポートする際のエラーの解決方法

推薦する

コンテナDockerCommitを介してイメージを送信し、DockerPushでイメージをプッシュします。

ローカルでコンテナを作成した後、このコンテナに基づいてローカル イメージを作成し、このイメージを D...

ウェブサイトがhttpsを有効にした後のSSLのセキュリティ構成と検出

最近のウェブサイトでは SSL を有効にするのが標準となっています。ただし、SSL を設定した後も、...

Vue.js フロントエンドプロジェクト向け多言語ソリューションのアイデアと実践

目次1. 通常どのようなコンテンツを処理する必要があるか2. 基本的な考え方3. 具体的な実践の詳細...

CSS3 でクールなスライス画像カルーセル効果を実現

今日は、CSS を使用してクールな画像カルーセル コンポーネントを作成する方法を学びます。その原理は...

Docker 大規模プロジェクトのコンテナ化変革

仮想化とコンテナ化は、クラウドベースのプロジェクトでは避けられない 2 つの問題です。仮想化は純粋な...

ウェブサイトデザインに関するヒント

実は、最近はウェブデザインについてよく耳にするようになりました。インターネット業界は今とても発展して...

JS でオブジェクト プロパティを簡単にトラバースするいくつかの方法

目次1. 自己列挙可能なプロパティ2. Object.values()はプロパティ値を返します3. ...

webpackコード断片化の実装

目次背景コモンズチャンクプラグイン分割チャンク構成リソースを非同期に読み込む要約する背景高性能なアプ...

Linux ネットワークプログラミングにおけるソケットオプションの実装

ソケットオプション機能機能: ソケットファイル記述子の属性の読み取りと設定に使用されるメソッド #i...

MysqlクエリJSON結果に関連する関数の概要

JSON 形式のフィールドは、MySQL 5.7 で追加された新しい属性ですが、基本的には文字列とし...

Vue-cli4 ルーティング構成の詳細な理解

目次序文 - Vue ルーティング1. 最も基本的なルーティング構成1. router/index....

IE6 で CSS スタイルの div または li の背景のタイリングと境界の破損を解決する方法

IE6 で CSS スタイルの div または li の背景のタイリングや境界の破壊を解決するには、...

モバイルレイアウト用の動的REMの実装

ダイナミックレム1. まず、現在の長さの単位を紹介しましょうpx em Mの幅 / 漢字の幅 1em...

CSS3 カスタムスクロールバースタイル::webkit-scrollbar サンプルコード詳細説明

Windows のデフォルトのスクロール バー スタイルは見苦しく、プロジェクト内でスクロール バー...

エコー後に要素編集フォームel-radioが選択できない問題を解決します

目次序文質問オンラインソリューション序文この記事の内容は私がこの業界に入ったときのメモを元にしている...