diff options
Diffstat (limited to 'tools/unix/fdswap')
| -rwxr-xr-x | tools/unix/fdswap | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/tools/unix/fdswap b/tools/unix/fdswap new file mode 100755 index 0000000..8b7d0bd --- /dev/null +++ b/tools/unix/fdswap | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | #!/bin/bash | ||
| 2 | # | ||
| 3 | # fdswap | ||
| 4 | # | ||
| 5 | if [ "$2" = "" ]; then | ||
| 6 | echo " | ||
| 7 | Usage: $0 /path/to/oldfile /path/to/newfile [pids] | ||
| 8 | Example: $0 /var/log/daemon.log /var/log/newvolume/daemon.log 1234 | ||
| 9 | Example: $0 /dev/pts/53 /dev/null 2345"; exit 0 | ||
| 10 | fi | ||
| 11 | |||
| 12 | if gdb --version > /dev/null 2>&1; then true | ||
| 13 | else echo "Unable to find gdb."; exit 1 | ||
| 14 | fi | ||
| 15 | |||
| 16 | src="$1"; dst="$2"; shift; shift | ||
| 17 | pids=$* | ||
| 18 | |||
| 19 | for pid in ${pids:=$( /sbin/fuser $src | cut -d ':' -f 2 )}; | ||
| 20 | do | ||
| 21 | echo "src=$src, dst=$dst" | ||
| 22 | echo "$src has $pid using it" | ||
| 23 | cmd=$(mktemp) | ||
| 24 | { | ||
| 25 | echo "attach $pid" | ||
| 26 | echo 'call (int)open("'$dst'", 66, 0666)' | ||
| 27 | for ufd in $(LANG=C ls -l /proc/$pid/fd | \ | ||
| 28 | grep "$src"\$ | awk ' { print $9; } '); | ||
| 29 | do echo 'call (int)dup2($1,'"$ufd"')'; done | ||
| 30 | echo 'call (int)close($1)' | ||
| 31 | echo 'detach'; echo 'quit' | ||
| 32 | sleep 5 | ||
| 33 | } | tee /dev/tty >$cmd | ||
| 34 | gdb -x $cmd | ||
| 35 | done | ||