質問は簡単です。潜在的に役に立つと思いました。開く(および閉じる)各瞬間実行中のプログラムの出力が必要です。より正確には、標準出力(およびエラー)を現在のシェルから別のシェル、/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 pid
kill %1
先入選出端末にダンプ(再使用cat MyOutput
)するには、その瞬間に出力ダンプが開始されます。
注意と警告:
- ダンプは、私が要求しないまですべての出力を保存します
FIFOs
。
最初に尋ねたのですか?洗うすべて。 - 別のファイルにリダイレクト(または追加)できますか?
cat MyOutput >> NewRealFile
cat MyOutput
他の端末でも使えますよ!- 警告する:2つの異なるプログラム(またはインスタンス)に出力を同じ
FIFOs
フラックスにリダイレクトするように要求すると、マージされます(いいえ先験的に行がどのプログラムから来たかを区別する方法)。 - 警告する:複数回要求すると(おそらく別の端末で)、要求ごとに1行ずつ提供され、要求者に出力を分割します。たぶん安全な解決策があるかもしれません。
答え2
あなたの質問を正しく理解した場合:
script 1>>~/out.fifo 2>>~/error.fifo
その後、監視するには、次の手順を実行できます。
watch cat ~/out.fifo
Fifosの代わりに実際のファイルを使用できます
script 1>/tmp/$0-out 2>/tmp/$0-error
その後、tail -fを実行すると、スクリプトの再実行時に置き換えられます。
私は2番目のアプローチを好むか、マルチプレクサ(スクリーンや今週の人気の生まれ変わり)を使用することを好みます。
screen -t "name" bash -c 'script'
それから
screen -r
「モニタリング」し、Ctrl+ad を押して外します。
実行後に出力を表示するには、スクリプトの最後で一時停止してください。
答え3
私があなたの場合は、出力をファイルにリダイレクトし、出力を表示したいときにそのファイルを追跡します...出力がかなり大きいと思われる場合は、ファイルサイズを制限できます。ファイルをディスクよりもメモリに書き込む方がはるかに速いと思う場合は、その方法は別の質問です。