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ビッグデータをインポートする際のエラーの解決方法

推薦する

CSS3 で translate と transition を使用する方法

translate と transition は非常に強力で、習得するのは不可能だといつも感じていま...

Linuxサーバーのファイアウォールを変更してポートへのリモートアクセスを許可する方法

1. 問題の説明セキュリティ上の理由から、新しく構築されたサーバー クラスターでは、指定されたポート...

MySQL 2級コンピュータ試験共通テストポイント 8つのMySQLデータベース設計最適化方法

MySQLデータベース設計の8つの最適化方法の詳細は次のとおりです。 1. 最も適切なフィールド属性...

負のマージントップ値は、ラベルテキストと入力の間の垂直中央揃えの問題を解決します。

ラベルテキストと入力の垂直方向の中央揃えを調整するのは簡単ではありません。padding、verti...

MySQL 8.0 WITH クエリの詳細

目次MySQL 8 の WITH クエリについて学ぶ1. 例3. 練習するMySQL 8 の WIT...

Dockerにおけるコンテナとイメージの違いについてお話ししましょう

鏡とは何ですか?イメージは、複数のイメージ レイヤー (UnionFS および AUFS ファイル ...

HTMLでアンカーの位置を設定するためのいくつかの一般的な方法

HTML でアンカーの位置を設定する方法はいくつかあるので、ここで紹介します。 1. ID ポジショ...

HTML ページ適応幅テーブル

WEB アプリケーションのページでは、テーブルがよく使用されます。列の数が限られているため、各列のコ...

HTML 挿入画像の例 (HTML 追加画像)

HTML に画像を挿入するには、画像を表示するための HTML タグが必要です。これは、img タ...

MySql における特殊演算子の使用の概要

序文MySQL には次の 4 種類の演算子があります。算術演算子比較演算子論理演算子ビット演算子これ...

MySQLの外部結合と内部結合クエリの違い

外部結合の構文は次のとおりです。フィールド名を選択FROM テーブル名 1 LEFT|RIGHT|F...

Samba を使用して Linux サーバー上で共有ファイル サービスを構築する方法

最近、私たちの小さなチームは、サーバー上の共有フォルダーを共有して、全員がパブリックリソースドキュメ...

最適なウェブページ幅とその互換性のある実装方法

1. Web ページをデザインするときに、幅を決定するのは非常に面倒な作業です。 jb51.net ...

CSS フォント、テキスト、リストのプロパティの詳細な紹介

1. フォントのプロパティcolorは、div{color:red;}のようにテキストの色を指定しま...