カスタムスクリプトでnohupコマンドを正しく使用する方法

カスタムスクリプトでnohupコマンドを正しく使用する方法

いくつかの自動化されたタスクを実行できるスクリプトがあります。スクリプトの最後で次のコマンドを実行します。

nohup ./MyServer &

このコマンドは、バックグラウンドでコンソールを使用してサーバーを起動します。 Nohupは以下を生成します。nohup.outファイルには標準コンソール出力の内容が含まれます。 Enter キーを押すと、コンソールに次のように表示されます。TC>\n

問題は、スクリプトでnohupコマンドを実行すると、コンソールでEnterキーが押し続けられていることです。

つまり、スクリプトで nohup コマンドを実行すると、nohup.out ファイルに毎秒数百万回書き込まれます。

ただし、コマンドを実行すると

nohup ./MyServer &

これらの記事は起こらず、私はいつもその記事で潜在的なエラーを見ることができますnohup.out文書。

自動化タスクを開始するカスタムスクリプトを実行し、スクリプトの実行が完了するのを待ってから(時間がかかります)、nohupコマンドを実行してサーバーを起動する必要がありますか?

答え1

GNU nohupがあるシステム(たとえば、デスクトップ/サーバーLinux)でこれを実行している場合、nohupはSIGHUP信号の処理を「無視」に設定し、stdout / stderrをその信号にリダイレクトするnohup.outだけでなく、標準入力が端末の場合、またリダイレクト標準入力次から/dev/null開くただ書くモードなので読み取るとエラーになります。

たとえば、スクリプトでバックグラウンドコマンドを実行すると、対応する標準入力が開いたところでリダイレクトされfoo &ました。/dev/null読み取り専用モードではリダイレクトは発生せず、そのモードで読み出すとエラーではなくEOFが発生します。

したがって、スクリプトを使用して端末でnohupの動作をシミュレートできます。

(trap '' HUP; command 0>/dev/null >logfile 2>&1 &) 

関連情報