在类UNIX系统上删除所有SYSTEM V共享内存和信号量

时间:2010-01-26 23:08:26

标签: linux unix posix semaphore shared-memory

如何在类UNIX系统上使用单个命令删除所有未使用的信号量和共享内存,例如Ubuntu?

11 个答案:

答案 0 :(得分:61)

在这里,保存并在shell上尝试此脚本(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

答案 1 :(得分:9)

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更改为真实用户名。

答案 2 :(得分:7)

我不知道如何一次删除所有内容,但您可以使用ipcs列出资源,然后使用ipcrm循环和删除。这应该有效,但需要一点工作。我记得我在课堂上做过一次。

答案 3 :(得分:7)

这适用于我的Mac OS:

for n in `ipcs -b -m | egrep ^m | awk '{ print $2; }'`; do ipcrm -m $n; done

答案 4 :(得分:4)

#!/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

答案 5 :(得分:1)

检查是否有任何要删除的内容:

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

太阳会是:

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

di.uoa.gr的诉讼

再次检查一切是否正常

删除您的 sems / shared mem - 假设您是没有管理员权限的工作站中的用户

答案 6 :(得分:1)

这就是我在FreeBSD中的做法:

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

答案 7 :(得分:1)

1行将完成所有

对于消息队列

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

ipcs -q将提供消息队列的记录

sed "$ d; 1,2d "将删除最后一个空行("$ d")和前两个标题行("1,2d"

awk将完成剩下的工作,即使用命令"ipcrm -q" w.r.t打印和删除。第2列(coz $2

的值

答案 8 :(得分:0)

既然您提到您正在使用NFS系统,那么您是否可以访问这些信号量和shared memory?我认为你误解了它们是什么,它们是一个API代码,使进程能够相互通信,semaphore是一个防止竞争条件和线程相互通信的解决方案,简单的回答,他们做的不要在任何文件系统上留下任何残留物。

除非您使用插座或管道?你是否拥有删除它们的必要权限,为什么它们在NFS系统上?

希望这有帮助, 最好的祝福, 汤姆。

答案 9 :(得分:0)

除了bvamos的回答,根据文档,不推荐使用sem

  

NAME ipcrm - 删除消息队列,信号量集或共享内存ID   大纲ipcrm [-M key | -m id | -Q键| -q id | -S键| -s id]   ...弃用用法

     

ipcrm [shm |消息| sem] id ...

删除共享内存

我们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

删除邮件队列

我们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

删除信号量

我们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

答案 10 :(得分:0)

删除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