| #!/bin/sh |
| # |
| # shm_clear: clean out unattached (NATTACH=0) shm segments. |
| # See ipcs(1) and ipcrm(1). Tested on Linux and Solaris. |
| # |
| # Usage: |
| # shm_clear list and prompt for removal of your unattached shm segments. |
| # shm_clear -y assume "yes" to all the removal prompts. |
| # shm_clear -l only list (all of) your shm segments and exit. |
| # |
| |
| #set -xv |
| if echo "$1" | grep '^-h' > /dev/null; then |
| # -h or -help |
| tail +3 $0 | head -9 |
| exit |
| fi |
| |
| if [ "X$USER" = "X" ]; then |
| USER=$LOGNAME |
| fi |
| l_arg="shmid.*owner|CREATOR|$USER" |
| |
| # set up OS dependent cmdline opts, etc. |
| if [ `uname` = "Linux" ]; then |
| m_arg="-m" |
| r_arg="shm" |
| g_arg="^0x" |
| s_cmd="ipcs $m_arg -i %ID" |
| awkcut='{print $2, $6}' |
| elif [ `uname` = "SunOS" ]; then |
| m_arg="-ma" |
| r_arg="-m" |
| g_arg="^m" |
| s_cmd="ipcs $m_arg | egrep ' %ID |CREATOR' | grep -v IPC.status" |
| awkcut='{print $2, $9}' |
| else |
| echo unsupported OS: `uname` |
| exit 1 |
| fi |
| |
| list() { |
| if [ "X$1" = "X-L" ]; then |
| l_arg="$l_arg|." |
| echo "All shm segments for all:" |
| else |
| echo "All shm segments for $USER:" |
| fi |
| ipcs $m_arg | egrep "$l_arg" |
| echo |
| } |
| |
| show() { |
| cmd=`echo "$s_cmd" | sed -e "s/%ID/$1/g"` |
| eval $cmd |
| } |
| |
| remove() { |
| echo ipcrm $r_arg $1 |
| ipcrm $r_arg $1 |
| } |
| |
| if [ "X$1" = "X-l" -o "X$1" = "X-L" ]; then |
| # list only. both attached and unattached listed. |
| list $1 |
| exit 0 |
| fi |
| |
| if [ "X$1" = "X-y" ]; then |
| shift |
| yes=1 # assume "yes" to all delete questions. |
| else |
| yes="" |
| fi |
| |
| list |
| |
| ids=`ipcs $m_arg | grep "$g_arg" | grep $USER | awk "$awkcut" | grep ' 0$' | awk '{print $1}'` |
| if [ "X$ids" = "X" ]; then |
| echo "No unattached shmids for $USER." |
| fi |
| |
| for id in $ids |
| do |
| if [ $yes ]; then |
| : |
| else |
| echo "-------------------------------------" |
| show $id |
| printf "\nDelete? [y]/n " |
| read x |
| if echo "$x" | grep -i n > /dev/null; then |
| continue |
| fi |
| fi |
| remove $id |
| done |