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?
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
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.
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.
Cela fonctionne sur mon 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
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
)
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
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
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
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