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


26

何らかのプロセスが開始された仮想端末を閉じた場合、出力はに直接移動し/dev/nullますか、それとも何らかの方法でメモリを汚染しますか? とにかく出力を取得して、その後の任意の時点で読み続けることができますか?

[編集]:それで、プロセスを事実上無視する瞬間は、その出力を制御する私の力の終わりですか?

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


2
「とにかく出力を取得することができます」:汚いトリックなしではありません。しかし、実行中のプロセスを否認し、新しいスクリーンシェルに関連付けるにどうすればよいですかを参照してくださいダーティトリックに関するその他の引用された質問(すべてデバッガーをプログラムに接続し、何らかの方法で別の出力ファイルを開くことに基づいています)。
ジル 'SO-悪であるのをやめる'

その質問へのリンクをありがとう。これまでのところ、最高の答えが得られました!特に賢いrettyプログラム。
-rozcietrzewiacz

1
関連する質問に関するこの回答も参照してください。
ステファンギメネス

回答:


11

プロセスが「無視されている」という事実は、このプロセスを作成した対話型シェルにとってのみ意味があります。これは、シェルのジョブテーブルにプロセスが(もう)含まれておらず、シェルの終了時にSIGHUPがこのプロセスに送信されないことを意味します。それはあなたの質問とは本当に関係ありません。

削除された仮想端末に送信される出力に何が起こるかについて:自分でいくつかのテストを行いましたが、/dev/pts/xデバイスにアクセスできず、それらを指すすべてのファイル記述子が閉じられるまで再割り当てされないことに気付きました。そのため、削除された端末への書き込みが保存される理由がわかりません。これはPOSIXでも定義されていないと思います。

ターミナルに書き込むプロセスの出力を取得することについては、ターミナルがまだ生きているときでも可能だとは思いません¹。できることは、ターミナルへの直接入力(つまり、キーストローク、またはptyのマスター部分によるシミュレートされたキーストローク)を取得することだけです。プロセスが端末に書き込まれたものをstdinで読み取る場合、ほとんどのプロセスでself ioループが発生します。

プロセスの終了に関する最後の発言については、何が起こっているのか本当にわかりませんが、セッションが開始されると、プロセスグループのフォアグラウンド/バックグラウンド状態に関連するシグナル(SIGTTOU、SIGTTIN、SIGHUP、またはその他)のかなり奇妙な動作が疑われますリーダーが終了します(たとえばsu、あなたが言及した場合)。

編集への回答いいえ、出力に関しては、プロセスが否認されても何も変わりません。プロセスは制御端末に接続されたままです(デーモンのように既に切り離されていない限り)。あなたはそれを使用してそれを見ることができますps。ただし、このプロセスではシェルが提供するfg/ bg/ jobsコマンドを使用できなくなります。つまり、ターミナルからの入力をフィードするのが難しい場合があります(フォアグラウンドプロセスグループに所属する必要があります)


1.プロセスが喜んで、またはいくつかのデバッグツールでハイジャックされない限り(上記のコメントを参照)。


1
これを少し明確にしてくれてありがとう。実際、プロセスを否認するという事実はまだ私の質問に関連しています。プロセスを否認した後、その出力を制御する能力を失っているようですね。(端末が閉じられている場合でも)質問を編集して、そのケースを含めます。
-rozcietrzewiacz

4

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

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

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

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


感謝-プログラミングの観点からすてきな明確な説明。
rozcietrzewiacz

3

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

見る:

/programming/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-line

ヘルパースクリプトはhttp://users.linpro.no/ingvar/fdswap.sh.txtで入手できます。


0

この質問を指摘してくれたGillesのコメントのおかげで、rettyと呼ばれるプログラムについて学びました。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.