1. nohupと&の使い方
1.1、nohup (電話を切らない)
nohup は no Hang up の略で、電話を切らないことを意味します。
Xshell などの Linux クライアント ツールを使用して Linux スクリプトをリモートで実行すると、ネットワークの問題により、クライアントの接続が失われ、ターミナルが切断され、スクリプトが途中で予期せず終了することがあります。この場合、nohup コマンドを使用してコマンドを実行できます。クライアントがサーバーから切断されても、サーバー上のスクリプトは引き続き実行できます。
nohup 構文形式:
nohup command [arg...]
例証します:
- 入力操作(コマンド入力、改行入力、スペースキー入力など)ができないほか、
- 標準出力はnohup.outファイルに保存されます。
- クライアントを閉じた後も、コマンドはハングアップせずに実行されます。
例えば:
nohup sh test.shスクリプト コマンドを実行すると、ターミナルは入力を受け取ることができなくなり、標準出力が現在のディレクトリの nohup.out ファイルに出力されます。xshell を閉じて終了した後でも、現在のセッションは実行され続けます。
1.2、& (対話型)
&文法形式:
command [arg...] &
例証します:
- 入力操作 (コマンドの入力、改行、スペースの入力など) を実行でき、対話型の入出力操作を実行できます。
- 標準出力は nohup.out ファイルに保存されます。
- ただし、クライアントを閉じると、プログラムはすぐに停止します。
例えば:
sh test.sh & script コマンドを実行した後、xshell を閉じると、スクリプト プログラムがすぐに停止します。
1.3. nohup と & を一緒に使用する (ハングアップなし、対話型)
構文形式:
nohup command [arg...] &
例証します:
- 入力操作 (入力コマンド、改行、空白など) を実行でき、対話型の入出力操作を実行できます。
- 標準出力は nohup.out に保存されます。
- コマンドはクライアントを閉じた後も実行されます。
例:
nohup sh test.sh & コマンドを実行した後、入力操作が実行され、標準出力ログが nohup.out ファイルに書き込まれます。xshell が閉じられ、現在のセッションが終了しても、スクリプト コマンドは継続されます。走る。
入出力の問題は解決されましたが、完璧ですか? 実はまだ解決されていない問題がありますので、以下をお読みください。
2. ログのリダイレクト>
上記のログ ファイルのデフォルト名は nohup.out です。ログ ファイルの名前を変更すると、リダイレクトが使用されます。記号は > で、構文形式は次のとおりです。
> logFile
例証します:
> はリダイレクトの記号です。
logFile はログ ファイルの名前で、英語と数字が望ましいです。
現時点で、nohup、&、> で一緒に使用される文法形式は次のとおりです。
nohup command >logFile &
例:
nohup start.sh >aa.log &
注: 上記のコマンドを実行した後、入力またはバックグラウンドで実行することができ、実行ログが aa.log ログに出力されます。
3. エラーメッセージの対処方法
nohup command >logFile &
入出力の問題は解決されバックグラウンドでの動作が可能ですが、エラー情報がログファイルに出力できないという項目があり、この問題を解決するにはコマンド2>ファイルを追加する必要があります。
標準出力とエラー メッセージは同時に使用され、構文形式は次のとおりです。
>logFile1 2 >logFile2
「2ってどういう意味?」と疑問に思う人もいるかもしれません。以下をお読みください。
3.1. Linux の標準入力、出力、エラーメッセージの記号
Linux の標準入力、出力、エラー メッセージの記号:
0 は stdin (標準入力) 標準情報入力を意味します。1 は
stdout (標準出力) 標準情報出力を意味します。2
は stderr (標準エラー) エラー情報を意味します
。/dev/null は空のデバイス ファイルを意味します。ログを出力したくない場合は、このパラメータを使用します。
上記の例をもう一度見てみましょう。
>logFile1 2 >logFile2
> logFile1: つまり 1 >logFile1, 1 は標準情報出力です。これはデフォルトで省略可能です。logFile1 はログ ファイルの名前です。
2 >logFile2: 2 はエラー メッセージです。つまり、エラー メッセージは logFile2 ファイルに出力されます。
この時点で2の意味が分かりました!
3.2. エラーメッセージと標準出力を同じファイルに入れる
エラーメッセージと標準出力を同じファイルに入れたい場合は、2>&1 を使用します。構文は次のとおりです。
>logFile 2>&1
例証します:
>logFileは標準情報をlogFileファイルに出力することを示し、
2>&1は2(エラー情報)を1(標準出力)にリダイレクトして出力することを示します。
両者を共用するとは、2(エラー情報)と1(標準出力)が同じファイル(logFile)に出力されることを意味します。
3.3. 考え方: ログ情報を出力したくない場合はどうすればよいですか?
ヒント: /dev/null は空のデバイス ファイルを意味します。ログを出力したくない場合は、このパラメータを使用します。
4. 包括的な使用 (推奨)
最も完全な機能を要約すると、推奨される構文は次のとおりです。
nohup command >logFile 2>&1 &
例:
nohup start.sh > mySysLog.log 2>&1 &
説明: コマンドの実行後、標準出力 (1) とエラー情報 (2) が mySysLog.log ファイルに書き込まれます。
5. 知識の拡大
5.1. サービスを停止せずに nohup.out を直接クリアする
スクリプトの実行を続けると、nohup.out ログは増大し続けますが、ログのハード ディスク容量には制限があります。ログ ファイルのサイズを減らすにはどうすればよいですか?
ログ ファイルを直接削除しないでください。削除すると、サービスはログを出力できなくなり、異常によりサービスが即時に停止します。これは最も重大な本番事故です。
サービスを停止せずに nohup.out ファイルを直接クリアするには、2 つの方法があります。
# 第1种:
cat /dev/null > nohup.out
# 第2种:
cp /dev/null nohup.out
5.2. 比較的高い警告レベルのログのみを記録する
出力ログが多すぎるため、nohup.out が非常に早く成長するため、重要でないログについては記録できず、比較的高い警告レベルのログのみを記録することを選択します。
# エラーメッセージのみをログファイルに出力し、その他のログは出力しません
nohup ./program > /dev/null 2>error.log &
5.3、ログを出力したくない
ログは出力したくないし、サービスが正常に動作する限りログも出力したくない。
# ログは出力されません
nohup ./program > /dev/null 2>&1 &
—————————————————