1 #!/bin/sh 2 # 3 # shm_clear: clean out unattached (NATTACH=0) shm segments. 4 # See ipcs(1) and ipcrm(1). Tested on Linux and Solaris. 5 # 6 # Usage: 7 # shm_clear list and prompt for removal of your unattached shm segments. 8 # shm_clear -y assume "yes" to all the removal prompts. 9 # shm_clear -l only list (all of) your shm segments and exit. 10 # 11 12 #set -xv 13 if echo "$1" | grep '^-h' > /dev/null; then 14 # -h or -help 15 tail +3 $0 | head -9 16 exit 17 fi 18 19 if [ "X$USER" = "X" ]; then 20 USER=$LOGNAME 21 fi 22 l_arg="shmid.*owner|CREATOR|$USER" 23 24 # set up OS dependent cmdline opts, etc. 25 if [ `uname` = "Linux" ]; then 26 m_arg="-m" 27 r_arg="shm" 28 g_arg="^0x" 29 s_cmd="ipcs $m_arg -i %ID" 30 awkcut='{print $2, $6}' 31 elif [ `uname` = "SunOS" ]; then 32 m_arg="-ma" 33 r_arg="-m" 34 g_arg="^m" 35 s_cmd="ipcs $m_arg | egrep ' %ID |CREATOR' | grep -v IPC.status" 36 awkcut='{print $2, $9}' 37 else 38 echo unsupported OS: `uname` 39 exit 1 40 fi 41 42 list() { 43 if [ "X$1" = "X-L" ]; then 44 l_arg="$l_arg|." 45 echo "All shm segments for all:" 46 else 47 echo "All shm segments for $USER:" 48 fi 49 ipcs $m_arg | egrep "$l_arg" 50 echo 51 } 52 53 show() { 54 cmd=`echo "$s_cmd" | sed -e "s/%ID/$1/g"` 55 eval $cmd 56 } 57 58 remove() { 59 echo ipcrm $r_arg $1 60 ipcrm $r_arg $1 61 } 62 63 if [ "X$1" = "X-l" -o "X$1" = "X-L" ]; then 64 # list only. both attached and unattached listed. 65 list $1 66 exit 0 67 fi 68 69 if [ "X$1" = "X-y" ]; then 70 shift 71 yes=1 # assume "yes" to all delete questions. 72 else 73 yes="" 74 fi 75 76 list 77 78 ids=`ipcs $m_arg | grep "$g_arg" | grep $USER | awk "$awkcut" | grep ' 0$' | awk '{print $1}'` 79 if [ "X$ids" = "X" ]; then 80 echo "No unattached shmids for $USER." 81 fi 82 83 for id in $ids 84 do 85 if [ $yes ]; then 86 : 87 else 88 echo "-------------------------------------" 89 show $id 90 printf "\nDelete? [y]/n " 91 read x 92 if echo "$x" | grep -i n > /dev/null; then 93 continue 94 fi 95 fi 96 remove $id 97 done 98