在类UNIX系统,例如Ubuntu中,我该如何使用单个命令删除所有未使用的信号量和共享内存?
在类UNIX系统,例如Ubuntu中,我该如何使用单个命令删除所有未使用的信号量和共享内存?
在这里,保存并尝试使用此脚本(kill_ipcs.sh)在您的shell上:
#!/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
nattach
不为零吗?那这个呢?:ipcs -m | egrep "0x[0-9a-f]+ [0-9]+"|awk '{ if ($6 == 0) { print $2; } }'|xargs -n1 ipcrm -m
- Benxargs
替换for循环:echo $IPCS_S | xargs -n1 ipcrm -s
。 - user1202136IPCS_Q=
ipcs -q | egrep -i "0x[0-9a-f]+.*[0-9]+" | grep $ME | cut -f2 -d" "` - brainydexteripcs -s |grep $ME | awk '{print $2}'
awk 命令解决了定位问题。 - LeoPucciBr这在我的 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
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
删除。这应该可以解决问题,但需要一些工作。我记得在课堂上曾经成功实现过。
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
将完成剩下的工作,即根据第二列的值(因为$2
)使用命令"ipcrm -q"
打印并删除。
使用以下命令检查是否有需要删除的内容:
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提供
再次检查是否一切正常
删除您的sem/shared mem - 假设您是一个没有管理员权限的工作站用户
#!/usr/local/bin/bash for i in $(ipcs -a | grep "^s" | awk '{ print $2 }'); do echo "ipcrm -s $i" ipcrm -s $i done(注意:保留html标签)
sem
已被弃用:
名称ipcrm - 删除消息队列、信号量集或共享内存ID SYNOPSIS ipcrm [ -M key | -m id | -Q key | -q id | -S key | -s id ] ... 弃用的用法
ipcrm [ shm | msg | 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
ipcrm(1)
命令允许你逐个删除其他程序创建的 ipc 资源。 - Luis Colorado