====== 38 プロセスのPTSを別のPTSへ出力 ======
プロセスのファイルディスクリプタを別のPTSへ出力させる。
ファイルディスクリプタは通常、0:標準入力(stdin)、1:標準出力(stdout)、2:標準エラー出力(stderr)があって、
プロセスがファイルを開く場合は、3から割り当てられていく。
この1:標準出力(stdout)と2:標準エラー出力(stderr)を修正して別のPTSへ出力させます。
===== 1. 1つのコンソールでシェルを実行 =====
ただ5秒おきに時間を出力するだけのシェル
$ cat z.sh
#!/bin/bash
while true; do
date; sleep 5
done
$ bash z.sh
===== 2. プロセスの状態確認 =====
これで、プロセスID(**24870**)と現在の出力先が**/dev/pts/94**であることがわかる。
$ ps auxw| grep z.sh
matsui 24870 0.0 0.0 106108 1156 pts/94 S+ 21:46 0:00 /bin/bash ./z.sh
$ ll /proc/24870/fd/
total 0
lrwx------ 1 matsui users 64 May 1 21:47 0 -> /dev/pts/94
lrwx------ 1 matsui users 64 May 1 21:47 1 -> /dev/pts/94
lrwx------ 1 matsui users 64 May 1 21:47 2 -> /dev/pts/94
lr-x------ 1 matsui users 64 May 1 21:47 255 -> /home/matsui/z.sh
===== 4. もう一つのコンソールでpts確認 =====
$ tty
/dev/pts/96
===== 5. gdbでptsを変更 =====
これで**/dev/pts/96**に出力されるようになります。
gdbが入ってない場合は、yumでインストール: yum install gdb
$ gdb
(gdb) attach 24870
(gdb) p close(1)
$1 = 0
(gdb) p open("/dev/pts/96",1)
$2 = 1
(gdb) p close(2)
$3 = 0
(gdb) p open("/dev/pts/96",2)
$4 = 2
(gdb) detach
===== 6. ファイルに出力する事も可能 =====
出力するファイルだけ先に用意
$ touch /tmp/log
これで/tmp/logに出力されます。
$ gdb
(gdb) attach 24870
(gdb) p close(1)
$1 = 0
(gdb) p open("/tmp/log",1)
$2 = 1
(gdb) p close(2)
$3 = 0
(gdb) p open("/tmp/log",2)
$4 = 2
(gdb) detach
{{tag>linux}}