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