web-dev-qa-db-fra.com

Supprimez toutes les sémaphores et la mémoire partagée SYSTEM V sur des systèmes de type UNIX.

Comment puis-je supprimer tous les sémaphores non utilisés et la mémoire partagée avec une seule commande sur un système de type UNIX, par exemple Ubuntu? 

33
simone

Ici, enregistrez et essayez ce script (kill_ipcs.sh) sur votre 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

Nous l'utilisons chaque fois que nous exécutons des programmes IPCS sur le serveur d'étudiants universitaires. Certaines personnes ne nettoient pas toujours alors ... c'est nécessaire: P

60
neverMind
ipcs -s | grep $USERNAME | Perl -e 'while (<STDIN>) { @a=split(/\s+/); print `ipcrm sem $a[1]`}'

ou 

ipcs -s | grep $USERNAME | awk ' { print $2 } ' | xargs ipcrm sem

Remplacez $ USERNAME par un nom d'utilisateur réel.

9
bvamos

Je ne sais pas comment tout supprimer en même temps, mais vous pouvez utiliser ipcs pour répertorier les ressources, puis utiliser boucle et supprimer avec ipcrm. Cela devrait fonctionner, mais il faut un peu de travail. Je me souviens que je l’ai fait fonctionner une fois en classe.

7
MBO

Cela fonctionne sur mon Mac OS:

for n in `ipcs -b -m | egrep ^m | awk '{ print $2; }'`; do ipcrm -m $n; done
7
Serge
#!/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
2
WJC

1 ligne fera tout

Pour la file d'attente des messages 

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

ipcs -q donnera les enregistrements des files de messages 

sed "$ d; 1,2d " supprimera la dernière ligne vierge ("$ d") et les deux premières lignes d'en-tête ("1,2d")

awk fera le reste, à savoir imprimer et supprimer à l'aide de la commande "ipcrm -q" w.r.t. la valeur de la colonne 2 (coz $2)

1
pPanda_beta

Voici comment je le fais dans FreeBSD:

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

Vérifiez s'il y a quelque chose à supprimer avec:

ipcs -a | grep `whoami`

Sur linux, supprimez-les tous via:

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

Pour Sun ce serait:

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

la courtoisie de di.uoa.gr

Vérifiez à nouveau si tout va bien

Pour supprimer votre sems/mem mem - si vous êtes un utilisateur d'un poste de travail sans droits d'administrateur

1
Mr_and_Mrs_D

En plus de la réponse de bvamos, d'après la documentation, l'utilisation de sem est déconseillée:

NOM ipcrm - supprime une file de messages, un ensemble de sémaphores ou un identificateur de mémoire partagée SYNOPSIS ipcrm [-M clé | -m id | -Q clé | -q id | -S clé | -s id] ... usage déconseillé

ipcrm [shm | msg | sem] id ...

supprimer la mémoire partagée

us ipcrm -m pour supprimer un segment de mémoire partagée par son identifiant

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

ou ipcrm -M pour supprimer un segment de mémoire partagée à l'aide de la clé

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

supprimer les files de messages

us ipcrm -q pour supprimer un segment de mémoire partagée par son identifiant

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

ou ipcrm -Q pour supprimer un segment de mémoire partagée à l'aide de la clé

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

supprimer les sémaphores

us ipcrm -s pour supprimer un segment de sémaphore par son identifiant

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

ou ipcrm -S pour supprimer un segment de sémaphore à l'aide de la clé

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

supprimer tous les segments de mémoire partagée sous FreeBSD

#!/bin/sh
for i in $(ipcs -m | awk '{ print $2 }' | sed 1,2d);
do
    echo "ipcrm -m $i"
    ipcrm -m $i
done

supprimer tous les sémaphores

#!/bin/sh
for i in $(ipcs -s | awk '{ print $2 }' | sed 1,2d);
do
    echo "ipcrm -s $i"
    ipcrm -s $i
done
0
Richard Bartisek