Linux シェルのバックグラウンド起動コマンドでの nohup、&、およびリダイレクトの使用

 1. nohupと&の使い方


1.1、nohup (電話を切らない)


nohup は no Hang up の略で、電話を切らないことを意味します。

Xshell などの Linux クライアント ツールを使用して Linux スクリプトをリモートで実行すると、ネットワークの問題により、クライアントの接続が失われ、ターミナルが切断され、スクリプトが途中で予期せず終了することがあります。この場合、nohup コマンドを使用してコマンドを実行できます。クライアントがサーバーから切断されても、サーバー上のスクリプトは引き続き実行できます。

nohup 構文形式:

nohup  command  [arg...]


例証します:

  1. 入力操作(コマンド入力、改行入力、スペースキー入力など)ができないほか
  2. 標準出力はnohup.outファイルに保存されます。
  3. クライアントを閉じた後も、コマンドはハングアップせずに実行されます。

例えば:

nohup sh test.shスクリプト コマンドを実行すると、ターミナルは入力を受け取ることができなくなり、標準出力が現在のディレクトリの nohup.out ファイルに出力されます。xshell を閉じて終了した後でも、現在のセッションは実行され続けます。

1.2、& (対話型)
&文法形式:

command   [arg...]   &



例証します:

  1. 入力操作 (コマンドの入力、改行、スペースの入力など) を実行でき、対話型の入出力操作を実行できます。
  2. 標準出力は nohup.out ファイルに保存されます。
  3. ただし、クライアントを閉じると、プログラムはすぐに停止します

例えば:

sh test.sh & script コマンドを実行した後、xshell を閉じると、スクリプト プログラムがすぐに停止します。

1.3. nohup と & を一緒に使用する (ハングアップなし、対話型)
構文形式:

nohup   command  [arg...]  &



例証します:

  1. 入力操作 (入力コマンド、改行、空白など) を実行でき、対話型の入出力操作を実行できます。
  2. 標準出力は nohup.out に保存されます。
  3. コマンドはクライアントを閉じた後も実行されます。

例:
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 &
—————————————————
 

おすすめ

転載: blog.csdn.net/u010919402/article/details/127900305