原文:changing a process' file descriptor on the fly
debug產品中的乙個程式,發現debug資訊都沒有顯示出來,檢視了/proc//fd發現stdout/stderr都重定向到了/dev/null。由於重定向並不是這個程序本身的行為,並且不方便重啟這個程序,所以考慮重定向到新的位置。
使用gdb的功能。大概的過程是,attach到需要debug的程序p,open新的位置得到fd_redirect,把p的stdout/stderr(fd 1,2)重定向到fd_redirect。重定向是通過dup實現。具體**如下:
#!/bin/bash
## fdswap
#if [ "$2" = "" ]; then
echo "
usage: $0 /path/to/oldfile /path/to/newfile [pids]
example: $0 /var/log/daemon.log /var/log/newvolume/daemon.log 1234
example: $0 /dev/pts/53 /dev/null 2345"; exit 0
fiif gdb --version > /dev/null 2>&1; then true
else echo "unable to find gdb."; exit 1
fisrc="$1"; dst="$2"; shift; shift
pids=$*
for pid in $;
do echo "src=$src, dst=$dst"
echo "$src has $pid using it"
( echo "attach $pid"
echo 'call open("'$dst'", 66, 0666)'
for ufd in $(lang=c ls -l /proc/$pid/fd | \
grep "$src"\$ | awk ' ');
do echo 'call dup2($1,'"$ufd"')'; done
echo 'call close($1)'
echo 'detach'; echo 'quit'
sleep 5
) | gdb -q -x -
done
$ fdswap /var/log/mydaemon/output.log /dev/null 1234
如果當前使用者不是被debug的程序的owner,那麼需要root許可權。如果下面的命令可以在不輸入root密碼的情況下得到輸出「root」,那麼說明許可權是可以的
$ sudo whoami
開啟兩個終端a,b(terminal/console/telnet),分別執行下面的測試指令碼,得到當然終端的標準輸出,
#!/bin/bash
echo "this is the pid: $$"
echo "this is stdout:"; sudo ls -l /proc/$$/fd/1;
n=0; while true; do ((n++)); echo $n; sleep 1; done
假設a輸出:
$ bash foo.sh &
this is the pid: 28073
this is stdout:
lrwx------. 1 ingvar ingvar 64 nov 18 11:53 /proc/28073/fd/1 -> /dev/pts/9
12
b輸出:
$ bash foo.sh &
this is the pid: 28075
this is stdout:
lrwx------. 1 ingvar ingvar 64 nov 18 11:53 /proc/28073/fd/1 -> /dev/pts/6
12
下面,把b的程式停掉(ctrl+c),把a中重定向到b,可以使用命令:
$ sudo fdswap /dev/pts/9 /dev/pts/6 28073
JMeter中的跟隨重定向自動重定向
自動重定向 httpclient 接受到請求後,如果請求中包含重定向請求,httpclient是可以自動跳轉的,但是只是針對get與head請求,勾選此項 跟隨重定向 失效 自動重定向可以自動跳轉到最終目標頁面,jmeter不記錄重定向過程內容,只有乙個最終結果,不能對相應內容做關聯。跟隨重定向 h...
Linux中的重定向
1.輸出重定向 command filename 把標準輸出重定向到乙個新檔案中,當filename不存在時 command filename 把標準輸出重定向到乙個檔案中 追加 command filename 2 1 把標準輸出和錯誤一起重定向到乙個檔案中 command filename 2 ...
Linux中的重定向
標準輸入流 stdin 標準輸出流 stdout 標準錯誤 stderr 三個資料流其實就是三個檔案 在linux中檔案是具備檔案描述符的 比如0 1 2,分別對應上面三個流,其他的檔案都是從3開始標號的以此類推,都指向了終端,重定向就是改變其指向。符號 一般是指將輸出的結果指引到某個檔案。比如 l...