#!/usr/bin/env bash set -u set -e verbose=false OPTIND=1 while getopts ":v" opt; do case "$opt" in v) verbose=true ;; [?]) echo "Unknown option -$OPTARG" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument" >&2 exit 1 ;; esac done shift $((OPTIND-1)) if [[ "${1:-}" = "--" ]]; then shift; fi shm_users=() shm_count=() while read -r key shmid owner perms bytes nattch stat; do [[ "$nattch" = "0" ]] || continue if [[ -z "$key" ]] || [[ -z "$shmid" ]] || [[ -z "$owner" ]]; then echo "Invalid line from ipcs: \"${key} ${shmid} ${owner} ${nattch}\"!" >&2 exit 1 fi if ! output=$(ipcrm shm "$shmid" 2>&1); then echo "Failed to delete line from ipcs: \"${key} ${shmid} ${owner} ${nattch}\"!" >&2 echo "Output given: \"${output}\"" >&2 exit 1 fi found=false i=0 if [[ -n "${shm_users[*]:-}" ]]; then for user in "${shm_users[@]}"; do if [[ "$user" = "$owner" ]]; then (( ++shm_count[i] )) continue 2 fi (( ++i )) done fi shm_users[${#shm_users[*]}]=${owner} shm_count[${#shm_count[*]}]=1 done < <(ipcs -m | grep "^0x") if [[ -z "${shm_users[*]:-}" ]]; then ! $verbose || echo "No unattached SHM segments found." exit 0 fi total=0 echo "Removed SHM Segments:" echo "___________________________" echo "| OWNER | COUNT |" echo "|------------|------------|" for i in $(seq 0 $(( ${#shm_users[*]} - 1 ))); do printf '| %-10s | %10d |\n' "${shm_users[i]}" "${shm_count[i]}" (( total += shm_count[i] )) done echo "|____________|____________|" echo echo "Total: $total"