プログラムを正しく起動し、後のステップで実行されている出力(stdoutとstderr)をリダイレクトする方法は?

プログラムを正しく起動し、後のステップで実行されている出力(stdoutとstderr)をリダイレクトする方法は?

質問は簡単です。潜在的に役に立つと思いました。開く(および閉じる)各瞬間実行中のプログラムの出力が必要です。より正確には、標準出力(およびエラー)を現在のシェルから別のシェル、/dev/nullファイル、または元のシェルに自由にリダイレクトできるようにしたいです。

私が知っている事実を活用して、シンプルで安全なものを見つけました。あらかじめ出力をオン/オフします。答えも投稿します。


以下は最初の試みです。私はシェル番号35で作業しているとしましょう。

$ who am I                     # the command line to ask where am I
myuser  pts/35  ...            # The answer 

私の試みは、その端末を指すシンボリックリンクから始まりました。

ln -s /dev/pts/35  MyOutput  # The command to link

アイデアは、プログラムを起動し、そのリンクにリダイレクトを設定することです。

./Execute_program > MyOutput

動作し、出力を端末にリダイレクトしますが、リンクを変更するコマンドを実行すると、

ln -sf  /dev/null  MyOutput

リンクが変わり、ただし、リダイレクトは変更されません。私が望むように。実行中のプロセスによっては変更されません。同じ方法で新しいプログラムを起動すると、リダイレクトはリンクの新しい規則に従います。
再起動して出力リンクを/dev/null抑制するように設定すると、期待どおりに機能しますが、リンクを再度変更してもリダイレクトは変更されません。
リンクにリンクしても同じ結果が出ます。使用してもhard link状況は変わりません。

悲しいことにシェルは起動時にコマンドラインを展開します。

同様の方法でこれを実行できますか?または、リンクが変更されたプロセス(またはPPIDプロセス)と通信する方法を見つけることができますか?


メモ:

「実行中のプロセスの出力をどのようにリダイレクトしますか?」シリーズの質問ですが、この時点では始まりません。「あっ、プログラムを始めましたが、出力をリダイレクトするのを忘れました。今、これをやりたいです」しかし、反対の観点から見ると、「後の段階で出力を別の場所にリダイレクトしたいという明示的な目標を持ってプログラムをどのように始めますか?」です。

プログラムのソースコードを修正することが不可能または不便な場合は、このプロセスを利用しようとします。
読むdisownある画面から別の画面に処理、使用、転送できますscreen。あるいは、デバッガを使用してプロセスを傍受することもできます。これらのソリューションはすべて経験と労力で機能できますが、一部のソリューションは特定の比例リスクを示します。

ベストアンサー1

mkfifo名前付きパイプを作成して解決策を見つけました。先入選出
これは、シンボリックリンクを作成し、シェルが許可するすべてのリダイレクトを使用するのと同じくらい簡単です。

mkfifo MyOutput

ls -l与えられた

0 prw-r--r-- 1 My_username My_username  0 May 11 17:45 MyOut|

このリンクにリダイレクトしてプログラムを起動できます

./Execute_program > MyOutput  &  cat MyOutput 

出力が端子から流れ始めます。

ctrl+を押すとプロセスは中断されますが、実行中のプロセスは中断されません(これを行うには、または同じものを使用する必要がありcます)。二度目に聞いてみるとkill pidkill %1
先入選出端末にダンプ(再使用cat MyOutput)するには、その瞬間に出力ダンプが開始されます。

注意と警告:

  • ダンプは、私が要求しないまですべての出力を保存しますFIFOs
    最初に尋ねたのですか?洗うすべて。
  • 別のファイルにリダイレクト(または追加)できますか?cat MyOutput >> NewRealFile
  • cat MyOutput他の端末でも使えますよ!
  • 警告する:2つの異なるプログラム(またはインスタンス)に出力を同じFIFOsフラックスにリダイレクトするように要求すると、マージされます(いいえ先験的に行がどのプログラムから来たかを区別する方法)。
  • 警告する:複数回要求すると(おそらく別の端末で)、要求ごとに1行ずつ提供され、要求者に出力を分割します。たぶん安全な解決策があるかもしれません。

おすすめ記事