[解決済み] 既に実行中のプロセスの出力をリダイレクトする方法 [重複]。
質問
通常であれば、次のようなコマンドを起動します。
longcommand &;
のようにすれば、リダイレクトできるのは知っています。
longcommand > /dev/null;
を出力させないようにしたり
longcommand 2>&1 > output.log
で出力をキャプチャします。
しかし、私は時々忘れてしまうので、事後的にキャプチャまたはリダイレクトする方法はないかと考えていました。
longcommand
ctrl-z
bg 2>&1 > /dev/null
などと書いておくと、ターミナルにメッセージが出ずに使い続けられます。
解決方法は?
まず最初にコマンドを実行します。
cat > foo1
をあるセッションで実行し、stdinからのデータがファイルにコピーされることをテストします。次に、別のセッションで出力をリダイレクトします。まず、プロセスのPIDを探します。
$ ps aux | grep cat rjc 6760 0.0 0.0 1580 376 pts/5 S+ 15:31 0:00 cat
次に、開いているファイルハンドルを確認します。
$ ls -l /proc/6760/fd total 3 lrwx—— 1 rjc rjc 64 Feb 27 15:32 0 -> /dev/pts/5 l-wx—— 1 rjc rjc 64 Feb 27 15:32 1 -> /tmp/foo1 lrwx—— 1 rjc rjc 64 Feb 27 15:32 2 -> /dev/pts/5
ここでGDBを実行します。
$ gdb -p 6760 /bin/cat GNU gdb 6.4.90-debian [license stuff snipped] Attaching to program: /bin/cat, process 6760 [snip other stuff that's not interesting now] (gdb) p close(1) $1 = 0 (gdb) p creat("/tmp/foo3", 0600) $2 = 1 (gdb) q The program is running. Quit anyway (and detach it)? (y or n) y Detaching from program: /bin/cat, process 6760
は
p
GDB のコマンドは式の値を表示します。式は呼び出す関数であったり、システムコールであったりします...そこで、私はclose()
システムコールを実行し、ファイルハンドル1を渡し、次にcreat()
システムコールを使って新しいファイルを開きます。その結果creat()
は1であり、これは前のファイルハンドルを置き換えたことを意味します。もし標準出力と標準エラーに同じファイルを使いたい場合、あるいはファイルハンドルを他の番号に置き換えたい場合、私はdup2()
システムコールで実現します。この例では
creat()
の代わりにopen()
というのは、パラメータが少ないからです。フラグのCマクロはGDBからは使えないので(Cヘッダを使わない)、これを発見するためにはヘッダファイルを読む必要があります。0600は、所有者が読み取り/書き込みのアクセス権を持ち、グループとその他がアクセス権を持たないことを示す8進数のパーミッションであることに注意してください。このパラメータに0を指定して、後でそのファイルに対してchmodを実行することも可能です。その後、結果を検証しています。
ls -l /proc/6760/fd/ total 3 lrwx—— 1 rjc rjc 64 2008-02-27 15:32 0 -> /dev/pts/5 l-wx—— 1 rjc rjc 64 2008-02-27 15:32 1 -> /tmp/foo3 <==== lrwx—— 1 rjc rjc 64 2008-02-27 15:32 2 -> /dev/pts/5
にさらにデータを打ち込む。
cat
の結果は、ファイル/tmp/foo3
に追加される。元のセッションを閉じたい場合は、そのセッションのファイルハンドルをすべて閉じ、制御用ttyとなりうる新しいデバイスを開いてから
setsid()
.
関連
-
Kali Linuxのデフォルトのひげメニューアイコンを変更する方法は?
-
[解決済み] Linuxで特定のテキストを含むすべてのファイルを検索するにはどうすればよいですか?
-
[解決済み] Bashスクリプトのソースディレクトリをスクリプト自体から取得するにはどうすればよいですか?
-
[解決済み] Bashシェルスクリプトでディレクトリが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashで通常のファイルが存在しないかどうかを判断する方法を教えてください。
-
[解決済み] Bashスクリプトからプログラムが存在するかどうかを確認するにはどうすればよいですか?
-
[解決済み] Bashでコマンドの出力に変数を設定するにはどうすればよいですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] Bashで標準出力と標準エラーの両方をファイルにリダイレクトして追記する方法
-
[解決済み] 出力をファイルや標準出力にリダイレクトする方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
LinuxでSteamをダウンロードしインストールする方法
-
deepin20にフォントを追加する方法は?deepin20にフォントをインストールする方法は?
-
Linux NICがRTNETLINK answersというエラーで起動できない場合、どうすればよいですか?ファイルが存在するか?
-
ロックされたdeepinファイルを削除する方法は?deepinのロック付きファイルを削除する方法のヒント
-
Linux 5.10.10 正式版リリース:NULLポインタの不具合修正など。
-
linux(ubuntu 18.04)でのアイデア運用データベース障害問題について
-
ubuntu 12.04 eclipse でプログラム g++ がパスに見つからなかったと報告される。
-
[解決済み] エクスポートされた環境変数を削除する方法を教えてください。
-
[解決済み] Bashでファイルの中身をループする
-
[解決済み] コマンドラインを使用して、起動後のプロセスのSTDERR / STDOUTをリダイレクトする?