UNIXのようなシステム(Ubuntuなど)で単一のコマンドを使用して、使用されていないすべてのセマフォと共有メモリを削除するにはどうすればよいですか?
ここで、シェルでこのスクリプト(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
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を実際のユーザー名に変更します。
一度にすべてを削除する方法はわかりませんが、ipcs
を使用してリソースをリストし、ipcrm
でループと削除を使用できます。これは機能するはずですが、少し作業が必要です。私はそれをクラスで一度働かせたことを覚えています。
これは私のMac OSで動作します:
for n in `ipcs -b -m | egrep ^m | awk '{ print $2; }'`; do ipcrm -m $n; done
#!/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
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
)
これは私がFreeBSDでそれを行う方法です:
#!/ usr/local/bin/bash for i in $(ipcs -a | grep "^ s" | awk '{print $ 2}'); do echo "ipcrm -s $ i" ipcrm -s $ i done
削除するものがあるかどうかを確認します:
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を削除する場合-あなたが管理者権限のないワークステーションのユーザーであると仮定します
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
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