diff options
author | Hsieh Chin Fan <typebrook@gmail.com> | 2022-04-15 12:54:20 +0800 |
---|---|---|
committer | Hsieh Chin Fan <typebrook@gmail.com> | 2022-04-15 12:54:20 +0800 |
commit | 7bc48f847670293d1acb70c7dcbceaf55fef1e40 (patch) | |
tree | dd442139c2e85c8d74faca2cde02a2c359c87082 /tools/unix | |
parent | 5f94532c5a7603e8b79d0d755de95220185aed38 (diff) |
Update
Diffstat (limited to 'tools/unix')
-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 | ||