web-dev-qa-db-ja.com

nohup ...&dockerスクリプトで期待どおりに機能しない

私はこのような単純なDockerfileを持っています

FROM ubuntu:latest
ADD run.sh /run.sh
CMD /run.sh

Run.shには、これがあります(これも非常に簡単です)

#!/bin/bash
Nohup awk 'BEGIN { while (c++<50) print "y" }' &
sleep 10

Bashからdockerでスクリプトを実行すると(つまり、対話モードでbashコマンドを実行し、そこでスクリプトを実行します)、スクリプトは正しく機能します。「Nohupモード」になり、出力はNohup.outに正しく表示されます。

ただし、/run.shデフォルトのコマンドとして、出力はまだSTDOUTにあります。

何が悪いのですか?なぜそれはdocker、bashで機能しますが、インタラクティブモードから実行された場合のみですか?

4
Karel Bílek

Nohupは、コマンドがターミナルに送信される場合にのみ、コマンドの出力をリダイレクトします。出力が既に別のタイプのファイル(通常のファイルやパイプなど)に送信されている場合、Nohupはこれが望ましいと想定し、Nohup.outにリダイレクトしません。

デフォルトでは、docker runはソケットを介してコマンドを実行します(ホストを仮想環境に接続します—これがホストの通信方法です)。ソケットはターミナルではないので、Nohupはリダイレクトを実行しません。

docker run -tを実行すると、Dockerはコンテナ内のターミナルをエミュレートするため、NohupNohup.outにリダイレクトします。コマンド名を渡さない場合、Dockerはdocker run -t bashを使用したかのように動作します。

最善の解決策は、コマンドの出力を選択したログファイルに明示的にリダイレクトすることです。 stderrもリダイレクトすることを忘れないでください。そうすれば、彼らがどこに行くのかがわかるでしょう。

Nohup awk 'BEGIN { while (c++<50) print "y" }' >myscript.log 2>&1 &

私はDockerについてはあまり詳しくありませんが、コマンドの出力のリダイレクトに関しては Nohupには内部的な魔法があります です。それは、自身の出力がポイントされている場所に応じて、さまざまな場所に送信します。

詳細については、リンクされた回答を参照してください。正確な回答はその間のどこかにあります NohupのPOSIX仕様

2
Wildcard