From 7bc48f847670293d1acb70c7dcbceaf55fef1e40 Mon Sep 17 00:00:00 2001 From: Hsieh Chin Fan Date: Fri, 15 Apr 2022 12:54:20 +0800 Subject: Update --- tools/unix/fdswap | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100755 tools/unix/fdswap (limited to 'tools/unix') 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 @@ +#!/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 +fi + +if gdb --version > /dev/null 2>&1; then true +else echo "Unable to find gdb."; exit 1 +fi + +src="$1"; dst="$2"; shift; shift +pids=$* + +for pid in ${pids:=$( /sbin/fuser $src | cut -d ':' -f 2 )}; +do + echo "src=$src, dst=$dst" + echo "$src has $pid using it" + cmd=$(mktemp) + { + echo "attach $pid" + echo 'call (int)open("'$dst'", 66, 0666)' + for ufd in $(LANG=C ls -l /proc/$pid/fd | \ + grep "$src"\$ | awk ' { print $9; } '); + do echo 'call (int)dup2($1,'"$ufd"')'; done + echo 'call (int)close($1)' + echo 'detach'; echo 'quit' + sleep 5 + } | tee /dev/tty >$cmd + gdb -x $cmd +done -- cgit v1.2.3-70-g09d2