如何在类UNIX系统上使用单个命令删除所有未使用的信号量和共享内存,例如Ubuntu?
答案 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