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


110

どのようにコンソール/ターミナルビューをアプリケーションの出力に「アタッチ」して、それが何を言っているかを確認できますか?

アプリケーションを強制終了せずにアプリケーション出力から切り離すにはどうすればよいですか?

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


1
プロセスにデバッグシンボルがありますか?本番環境で動作しますか?もしそうなら、あなたはそれが決して一時停止される必要はありませんか?
yves Baumes、2009

キノのようなエンドユーザープログラムで安定性の問題が発生した場合(音がクラッシュして終了します)、どのように/なぜクラッシュしたかを知りたいので、修正に取り組みます。これは私が開発しているプログラムではありませんが、トラブルシューティングのために知りたいテクニックです。以下の提案を試してみます。
アギタン2009

回答:


17

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

別のオプションは、一種のテキストベースのターミナルアプリケーションである「画面」内でプログラムを起動することです。スクリーンセッションは接続したり切り離したりできますが、名目上は同じユーザーだけが使用することを目的としているため、ユーザー間でスクリーンセッションを共有したい場合、お尻に大きな負担がかかります。


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

2
ファイルに書き込まれる出力を取得するには、おそらくtail -f $ log_fileが必要です。また、いいえ、すでに実行中のアプリでそれを行う方法を知る方法はありません。
バルカン2009

@aggitan:いいえ。既存のアプリケーションでは、I / Oを制御端末にすでにバインドしているため、再起動する必要があります。
Don Werve


286

私はここにもっと簡単な解決策があると思います。/procパスの下でアクセス可能な疑似ファイルシステムの下で、探しているPIDに対応する名前のディレクトリを探してください。したがって、IDが1199のプログラムを実行している場合は、次のようにしますcd

$ cd /proc/1199

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

$ cd fd

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

$ tail -f 1

9
tail私の場合のように出力を別のプロセスにリダイレクトして入力することはできませんでしたがmore、現在のデータは表示されました。
Ωmega

10
このサイトで最も魅力的な投稿の1つです。
ロバート

2
more私のために働いています。ノードプロセスでのubuntu 14.04
Shih-Min Lee

1
これは、System.out.printlnを呼び出すJavaプロセスでは機能しません。何も出力は全くありませんの/ proc / [PID] / FD / 1
ニック・

1
以下を使用して複製を作成しようとしましたが、役に立ちませんでした: `` `docker run -it --name container1 ubuntu bash -c -i" COUNT = 0; while true; do echo Keep Keep the dance floor beat going;(( COUNT ++)); sleep 1; echo \ "Count is:\ $ {COUNT} \"; done; " `` `別のターミナル:` `` docker exec -it container1 tail -f / proc / 1 / fd / 1 `` `
JacobWuzHere

54

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

strace -ewrite -p $PID

それはまさにあなたが必要とするものではありませんが、それは非常に近いです。

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


おかげで動作しますが、出力は切り捨てられます。たとえば、pingの場合:write(1、 "1.0.0.1から64バイト:icmp_seq =" ...、56)= 56
izy

8

どのようにコンソール/ターミナルビューをアプリケーションの出力に「アタッチ」して、それが何を言っているかを確認できますか?

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

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

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

基本的に:

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

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


5

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

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

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

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

2

ローカルで実行されていたyumアップグレードプロセスをリモートで監視したかったので、これを行うためのより効率的な方法があったとしても、次のようにしました。

watch cat /dev/vcsa1

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

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

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