web-dev-qa-db-ja.com

否認されて端末を失ったプロセスの出力はどうなりますか?

何らかのプロセスが開始された仮想ターミナルを閉じると、出力は/dev/null、またはそれはどういうわけかメモリを汚染できますか? とにかく出力を取得して、その後いつでも読み続けることができますか?

[編集]:つまり、プロセスを否認する瞬間は、その出力を制御する私の力の終わりですか?

また、停止したプロセスを否認した場合、最初はすべてが正常に見えるようになりました。それは終了されず、ジョブにも表示されません。しかし、ログアウトした場合(そしてしないは、ターミナルを閉じることを意味します。たとえば、suを終了するだけです)、プロセス終了します。同じように、バックグラウンドで実行されている不名誉なプロセスは実行を続けることができます。

26
rozcietrzewiacz

この特定の質問に対処するためだけに:

プロセスが開始された仮想端末を閉じると、出力は/ dev/nullに直接送られるのですか、それともなんらかの方法でメモリを汚染しますか?

端末とそれに接続されているプログラムは、ファイルのように読み書きするttyデバイスを介して通信します。具体的には、仮想端末が「疑似tty」(略して「pty」)を作成してから、シェル(またはその他の)プロセスを起動し、そのプロセスのstdin/out/errをptyに接続します。 (詳細はオペレーティングシステムによって異なります。)

仮想端末を閉じると、仮想端末は接続の端(pty "マスター")を閉じます。その後、接続の反対側のプログラムがttyに書き込むと、エラーが返され、データはどこにも行きません。同様に、ttyから読み取る場合、EOF(ファイルの終わり)インジケーターが返されます。

5
Chris Page

質問の最も興味深い部分に答えるには、実行中のプログラムの出力を変更するには、ファイル記述子を編集する必要があります。これは、gdbを使用すると非常に簡単です。それはハックですが、動作します。

見る:

https://stackoverflow.com/questions/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-line

ヘルパースクリプトは http://users.linpro.no/ingvar/fdswap.sh.txt にあります。

3
Yves Junqueira

Gillesのコメントに感謝し、 この質問 を指摘してくれた retty というプログラムについて知りました。

(疑似)ttyに効果的に再接続するために、ダーティなハックを使用しているようです-取り消されているかどうかに関係なく、プロセスの出力の読み取りを継続できます。したがって、これは私の質問の最初の部分のほとんどに答えるようです。 2番目の回答は ステファンによる でした。

0
rozcietrzewiacz