質問 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 を応援していただきありがとうございます。 以下もご興味があるかもしれません:
|
<<: JavaScriptのプリコンパイルを見てみましょう(概要)
>>: NavicatでMySQLビッグデータをインポートする際のエラーの解決方法
目次百万レベルのデータ処理ソリューションデータストレージ構造設計クエリステートメントの最適化1000...
I. 概要HTML テンプレートを作成するときに、テキスト レイアウトの手段としてスペースが使用さ...
国務院は本日、新型コロナウイルス感染症との闘いで殉教した方々と犠牲者に対し、全国各民族人民の深い哀悼...
目次1. はじめに2. 解決すべきいくつかの重要な問題3.最後に書く1. はじめに最近、Cocos ...
イメージをプルします: [mall@VM_0_7_centos ~]$ sudo docker pu...
質問コードにはプロンプトがありません: RN 開発に不慣れな、フロントエンド以外の学生の多くは、「ど...
CSS3 アニメーション トランジションを使用して、リンクの上にマウスを移動すると小さなポップアップ...
序文私のように、Java バックエンドに勤勉な人であれば、多数のプロジェクト機能を実装することに加え...
最近、あるウェブサイトのバックエンドに一連の統計機能を追加していたのですが、条件によるカウントが必要...
具体的なコードは次のとおりです。 <!DOCTYPE html> <html>...
ReactとはReact は、効率的で高速なユーザー インターフェイスを構築するためのシンプルな J...
前回の記事に引き続き、web02 サーバーを作成し、web01 サーバーと web02 サーバーの ...
MySQL は、異なるユーザーに異なる権限を割り当てることができるマルチユーザー管理データベースであ...
apk add ansible を使用して、alpine イメージに ansible サービスを追加...
この記事では、アンカー配置を実装するためのVueの具体的なコードを例として紹介します。具体的な内容は...