2つのシェルスクリプトa.shとb.shを作成しました。 a.shとb.shには無限のforループがあり、端末に出力を出力します。 a.shとb.shの両方を呼び出す別のスクリプトを作成したいのですが、スクリプトを無限に実行するのではなく、ユーザーがすぐにターミナルの制御を取り戻し、ターミナルの出力を非表示にする必要があります。
バックグラウンドジョブの終了に時間がかかる場合、またはSecureCRTなどを使用してサーバーにログインする場合は、Nohup
を使用します。
stdoutおよびstderrを/dev/null
にリダイレクトして、出力を無視します。
Nohup /path/to/your/script.sh > /dev/null 2>&1 &
出力を次のようなファイルにリダイレクトします。
./a.sh > somefile 2>&1 &
これにより、stdoutとstderrの両方が同じファイルにリダイレクトされます。 stdoutとstderrを2つの異なるファイルにリダイレクトする場合、これを使用します。
./a.sh > stdoutfile 2> stderrfile &
Stdoutやstderrを気にしない場合は、/dev/null
をファイルの一方または両方として使用できます。
リダイレクトの詳細については bash manpage をご覧ください。
申し訳ありませんが、これは少し遅れていますが、標準またはエラー出力が必要ないシンプルなコマンドの理想的なソリューションを見つけました(クレジット: http://felixmilea.com/2014/12/running-bash -commands-background-properly / )
これにより、出力がnullにリダイレクトされ、画面が明確になります。
command &>/dev/null &
以下を含むスクリプトと同じディレクトリにある場合:
./a.sh > /dev/null 2>&1 &
./b.sh > /dev/null 2>&1 &
最後の&
は、スクリプトをバックグラウンドで実行させるものです。
> /dev/null 2>&1
部分は必要ありません-stdoutおよびstderrストリームをリダイレクトするので、ターミナルでそれらを見る必要はありません。大量の出力を伴う騒々しいスクリプトの場合はそうすることができます。
サブシェルで実行して通知を削除し、STDOUTおよびSTDERRを閉じます。
(&>/dev/null script.sh &)
これらの例は問題なく動作します:
Nohup sh prog.sh proglog.log 2>&1&
Forループは次のように使用できます:
{1..10}のi sh prog.shを実行します。睡眠1; done prog.log 2>&1&
バックグラウンドで動作し、出力は表示されません。
Nohup sh -x runShellScripts.sh &
Linuxキックスタートでスクリプトを実行する場合は、次のように実行する必要があります。
sh /tmp/script.sh > /dev/null 2>&1 < /dev/null &