如何在类 UNIX 系统(例如 Ubuntu)上使用单个命令删除所有未使用的信号量和共享内存?
11 回答
在这里,保存并在您的 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
这适用于我的 Mac OS:
for n in `ipcs -b -m | egrep ^m | awk '{ print $2; }'`; do ipcrm -m $n; done
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 更改为真实用户名。
#!/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
列出资源,然后使用循环和删除ipcrm
。这应该可行,但需要做一些工作。我记得我在课堂上做过一次。
检查是否有任何要删除的内容:
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/共享内存 - 假设您是工作站中没有管理员权限的用户
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
)
这就是我在 FreeBSD 中的做法:
#!/usr/local/bin/bash for i in $(ipcs -a | grep "^s" | awk '{ print $2 }'); 做 回声“ipcrm -s $i” ipcrm -s $i 完毕
除了 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
删除 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