web-dev-qa-db-ja.com

表示するプロセス出力に添付する

コンソール/端末ビューをアプリケーションの出力にどのように「添付」して、それが何を言っているのかを見ることができますか?

アプリケーションを強制終了せずに、アプリケーション出力からデタッチするにはどうすればよいですか?

通常、コマンドラインを使用しておしゃべりなアプリケーションを起動すると、あらゆる種類の素晴らしい出力が表示されます。ただし、KINOのような特におしゃべりなプログラミングを実行しており、コマンドラインから再起動せずに、任意の時点で出力を表示したいとします。私はできない;少なくとも、私には方法がわかりません。

100
aggitan

ここにはいくつかのオプションがあります。 1つは、コマンドの出力をファイルにリダイレクトし、「tail」を使用して、そのファイルにリアルタイムで追加される新しい行を表示することです。

別のオプションは、「スクリーン」内でプログラムを起動することです。「スクリーン」は、一種のテキストベースのターミナルアプリケーションです。スクリーンセッションはアタッチおよびデタッチできますが、名目上は同じユーザーのみが使用することを意図しているため、ユーザー間でスクリーンセッションを共有したい場合は、面倒です。

14
Don Werve

ここでもっと簡単な解決策があると思います。 /procパスでアクセスできる擬似ファイルシステムの下で、探しているPIDに対応する名前のディレクトリを探します。そのため、IDが1199であるプログラムを実行している場合、cdがそれに含まれます。

$ cd /proc/1199

次に、下のfdディレクトリを探します

$ cd fd

このfdディレクトリには、プログラムで使用しているファイル記述子オブジェクト(0:stdin、1:stdout、2:stderr)と、必要なtail -fだけが保持されます-この場合はstdout) :

$ tail -f 1
253
licorna

私はこれとまったく同じことを探していましたが、あなたができることがわかりました:

strace -ewrite -p $PID

必要なものではありませんが、非常に近いものです。

リダイレクト出力を試しましたが、それはうまくいきませんでした。プロセスがソケットに書き込みを行っていたためか、わかりません。

50
Paul Scheltema

コンソール/端末ビューをアプリケーション出力に「添付」して、それが何を言っているのかを見ることができますか?

この質問について、processusを起動する前にsceenコマンドを起動しなかった場合でも、出力をキャッチできることがわかっています。

試したことはありませんが、GDBを使用して(プロセスを再起動せずに)行う方法を説明する興味深い記事を見つけました。

実行プロセスからの出力のリダイレクト

基本的に:

  1. / proc/xxx/fdのおかげで、プロセスの開いているファイルのリストを確認してください
  2. AttachGDBを使用したプロセス
  3. 一時停止中に、興味のあるファイルを閉じて、close()関数を呼び出します(GDBでプロセスの任意の関数を実行できます。プロセスにデバッグシンボルが必要です。)
  4. create()またはopen()関数を呼び出して新しいファイルを開きます。 (最後にコメントを見ると、同じハンドルが使用されることを保証するために、dup2()を使用することを人々が提案するのがわかります)
  5. プロセスを切り離し、プロセスを実行します。

ところで、i386ボックスでLinux OSを実行している場合、コメントは出力を新しいコンソールにリダイレクトするためのより良いツールについて話している: 'retty'。もしそうなら、その使用を検討してください。

7
yves Baumes

ローカルで実行されたyumアップグレードプロセスをリモートで見たかったので、これを行うためのより効率的な方法はおそらくありましたが、次のようにしました。

watch cat /dev/vcsa1

使用されている端末に応じて、vcsa2、vcsa3などを使用したいのは明らかです。

端末ウィンドウがコマンドを実行している端末と同じ幅である限り、2秒ごとに現在の出力のスナップショットを見ることができました。他の場所で推奨されている他のコマンドは、私の状況では特にうまくいきませんでしたが、そのトリックはうまくいきました。

1
RedScourge

私にとって、これはうまくいきました:

  1. プロセスの所有者としてログインします(rootでも許可が拒否されます)

    ~$ su - process_owner
    
  2. 他の多くの回答で述べられているように、ファイル記述子を末尾にします。

    ~$ tail -f /proc/<process-id>/fd/1 # (0: stdin, 1: stdout, 2: stderr)
    
0
akki