39

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

4

11 回答 11

65

在这里,保存并在您的 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

于 2010-11-24T00:52:50.217 回答
11

这适用于我的 Mac OS:

for n in `ipcs -b -m | egrep ^m | awk '{ print $2; }'`; do ipcrm -m $n; done
于 2012-11-26T13:16:59.300 回答
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 更改为真实用户名。

于 2010-06-29T14:02:11.167 回答
9
#!/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
于 2016-08-01T17:01:53.833 回答
7

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

于 2010-01-26T23:27:14.857 回答
2

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

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/共享内存 - 假设您是工作站中没有管理员权限的用户

于 2012-04-20T13:51:24.897 回答
2

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"wrt 打印和删除第 2 列的值(coz $2

于 2016-05-28T20:20:01.197 回答
1

这就是我在 FreeBSD 中的做法:

#!/usr/local/bin/bash
for i in $(ipcs -a | grep "^s" | awk '{ print $2 }');
做
        回声“ipcrm -s $i”
        ipcrm -s $i
完毕
于 2013-03-22T17:16:29.417 回答
0

既然您提到您正在使用 NFS 系统,您是否有权访问这些信号量和共享内存?我认为您误解了它们是什么,它们是使进程能够相互通信的 API 代码,信号量是防止竞争条件和线程相互通信的解决方案,简单来说,它们不会留下任何残留物在任何文件系统上。

除非您使用的是套接字或管道?您是否具有删除它们的必要权限,为什么它们在 NFS 系统上?

希望这会有所帮助,最好的问候,汤姆。

于 2010-01-26T23:36:48.243 回答
0

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

名称 ipcrm - 删除消息队列、信号量集或共享内存 id SYNOPSIS ipcrm [ -M key | -m id | -Q 键 | -q id | -S 键 | -s id ] ... 不推荐使用

ipcrm [ shm | 味精 | sem] 身份证...

删除共享内存

我们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
于 2015-05-11T10:37:25.550 回答
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
于 2015-08-11T06:54:30.080 回答