重定向執行中的程式的fd(檔案描述符)

2021-08-21 11:55:24 字數 2131 閱讀 3184

原文: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...