web-dev-qa-db-ja.com

UNIXライクなシステム上のすべてのSYSTEM V共有メモリとセマフォを削除します

UNIXのようなシステム(Ubuntuなど)で単一のコマンドを使用して、使用されていないすべてのセマフォと共有メモリを削除するにはどうすればよいですか?

34
simone

ここで、シェルでこのスクリプト(kill_ipcs.sh)を保存して試してください。

#!/bin/bash

ME=`whoami`

IPCS_S=`ipcs -s | egrep "0x[0-9a-f]+ [0-9]+" | grep $ME | cut -f2 -d" "`
IPCS_M=`ipcs -m | egrep "0x[0-9a-f]+ [0-9]+" | grep $ME | cut -f2 -d" "`
IPCS_Q=`ipcs -q | egrep "0x[0-9a-f]+ [0-9]+" | grep $ME | cut -f2 -d" "`


for id in $IPCS_M; do
  ipcrm -m $id;
done

for id in $IPCS_S; do
  ipcrm -s $id;
done

for id in $IPCS_Q; do
  ipcrm -q $id;
done

私たちは、大学生のサーバーでIPCSプログラムを実行するたびに使用します。一部の人々は常にクリーンアップしないので...それが必要です:P

62
neverMind
ipcs -s | grep $USERNAME | Perl -e 'while (<STDIN>) { @a=split(/\s+/); print `ipcrm sem $a[1]`}'

または

ipcs -s | grep $USERNAME | awk ' { print $2 } ' | xargs ipcrm sem

$ USERNAMEを実際のユーザー名に変更します。

9
bvamos

一度にすべてを削除する方法はわかりませんが、ipcsを使用してリソースをリストし、ipcrmでループと削除を使用できます。これは機能するはずですが、少し作業が必要です。私はそれをクラスで一度働かせたことを覚えています。

7
MBO

これは私のMac OSで動作します:

for n in `ipcs -b -m | egrep ^m | awk '{ print $2; }'`; do ipcrm -m $n; done
7
Serge
#!/bin/bash
ipcs -m | grep `whoami` | awk '{ print $2 }' | xargs -n1 ipcrm -m
ipcs -s | grep `whoami` | awk '{ print $2 }' | xargs -n1 ipcrm -s
ipcs -q | grep `whoami` | awk '{ print $2 }' | xargs -n1 ipcrm -q
4
WJC

1行ですべて処理されます

メッセージキュー用

ipcs -q | sed "$ d; 1,2d" |  awk '{ print "Removing " $2; system("ipcrm -q " $2) }'

ipcs -qはメッセージキューのレコードを提供します

sed "$ d; 1,2d "は最後の空白行を削除します("$ d")と最初の2つのヘッダー行("1,2d"

awkは残りを実行します。つまり、コマンド"ipcrm -q" w.r.t.列2の値(coz $2

1
pPanda_beta

これは私がFreeBSDでそれを行う方法です:

#!/ usr/local/bin/bash 
 for i in $(ipcs -a | grep "^ s" | awk '{print $ 2}'); 
 do 
 echo "ipcrm -s $ i" 
 ipcrm -s $ i 
 done 
1
John Moss

削除するものがあるかどうかを確認します:

ipcs -a | grep `whoami`

Linuxでは、すべてを削除します:

ipcs | nawk -v u=`whoami` '/Shared/,/^$/{ if($6==0&&$3==u) print "ipcrm shm",$2,";"}/Semaphore/,/^$/{ if($3==u) print "ipcrm sem",$2,";"}' | /bin/sh

Sunの場合:

ipcs -a | nawk -v u=`whoami` '$5==u &&(($1=="m" && $9==0)||($1=="s")){print "ipcrm -"$1,$2,";"}' | /bin/sh

di.uoa.grの厚意による

すべて問題ないかもう一度確認します

your sems/shared memを削除する場合-あなたが管理者権限のないワークステーションのユーザーであると仮定します

1
Mr_and_Mrs_D

Bvamosの答えに加えて、ドキュメントによるとsemの使用は非推奨です:

名前ipcrm-メッセージキュー、セマフォセット、または共有メモリIDを削除します。 -m id | -Qキー| -q id | -Sキー| -s id] ...非推奨の使用法

ipcrm [shm | msg | sem] id ...

共有メモリを削除する

us ipcrm -m idで共有メモリセグメントを削除するには

#!/bin/bash

set IPCS_M = ipcs -m | egrep "0x[0-9a-f]+ [0-9]+" | grep $USERNAME | cut -f2 -d" "

for id in $IPCS_M; do
  ipcrm -m $id;
done

またはipcrm -Mキーで共有メモリセグメントを削除するには

#!/bin/bash

set IPCS_M = ipcs -m | egrep "0x[0-9a-f]+ [0-9]+" | grep $USERNAME | cut -f1 -d" "

for id in $IPCS_M; do
  ipcrm -M $id;
done

メッセージキューを削除する

us ipcrm -q idで共有メモリセグメントを削除するには

#!/bin/bash

set IPCS_Q = ipcs -q | egrep "0x[0-9a-f]+ [0-9]+" | grep $USERNAME | cut -f2 -d" "

for id in $IPCS_Q; do
  ipcrm -q $id;
done

またはipcrm -Qキーで共有メモリセグメントを削除するには

#!/bin/bash

set IPCS_Q = ipcs -q | egrep "0x[0-9a-f]+ [0-9]+" | grep $USERNAME | cut -f1 -d" "

for id in $IPCS_Q; do
  ipcrm -Q $id;
done

セマフォの削除

us ipcrm -sはIDによってセマフォセグメントを削除します

#!/bin/bash

set IPCS_S = ipcs -s | egrep "0x[0-9a-f]+ [0-9]+" | grep $USERNAME | cut -f2 -d" "

for id in $IPCS_S; do
  ipcrm -s $id;
done

またはipcrm -Sキーによるセマフォセグメントの削除

#!/bin/bash

set IPCS_S = ipcs -s | egrep "0x[0-9a-f]+ [0-9]+" | grep $USERNAME | cut -f1 -d" "

for id in $IPCS_S; do
  ipcrm -S $id;
done
0
RafaSashi

NFSシステムで作業していると述べたので、これらのセマフォと 共有メモリ にアクセスできますか?あなたはそれらが何であるかを誤解していると思う、彼らはプロセスが互いに通信できるようにするAPIコードである、 semaphore sは簡単な答えで、競合状態を防ぎ、スレッドが互いに通信するための解決策である、ファイルシステムに残留物を残しません。

ソケットまたはパイプを使用している場合を除きますか?それらを削除するために必要な許可を持っていますか、なぜNFSシステム上にあるのですか?

これがお役に立てば幸いです、よろしく、トム。

0
t0mm13b

freeBSD上のすべての共有メモリセグメントを削除するには

#!/bin/sh
for i in $(ipcs -m | awk '{ print $2 }' | sed 1,2d);
do
    echo "ipcrm -m $i"
    ipcrm -m $i
done

すべてのセマフォを削除する

#!/bin/sh
for i in $(ipcs -s | awk '{ print $2 }' | sed 1,2d);
do
    echo "ipcrm -s $i"
    ipcrm -s $i
done
0