2010-01-26 26 views
31

Come posso eliminare tutti i semafori e la memoria condivisa non utilizzati con un singolo comando in Ubuntu?Elimina tutta la memoria condivisa e i semafori su Linux

+3

Questa domanda ha davvero bisogno di una spiegazione di "Perché". –

+0

sto facendo un progetto scolastico nel c – simone

+3

Quindi, come al solito con i compiti, cosa sai, cosa hai provato? – Cascabel

risposta

7

Non so come eliminare tutto in una volta, ma è possibile utilizzare ipcs per elencare le risorse e quindi utilizzare il ciclo ed eliminare con ipcrm. Questo dovrebbe funzionare, ma ha bisogno di un po 'di lavoro. Ricordo che l'ho fatto funzionare una volta in classe.

+0

OP chiesto un singolo comando ... –

+3

Sappiamo se sta usando SysV ipc e non POSIX? – Duck

+0

@Duck Sappiamo che sta usando Ubuntu e ho controllato quei comandi su Ubuntu – MBO

0

Dato che hai menzionato che stai lavorando su un sistema NFS, hai accesso a quei semafori e shared memory? Penso che tu abbia frainteso quello che sono, sono un codice API che consente ai processi di comunicare tra loro, semaphore s sono una soluzione per prevenire le condizioni di gara e che i thread possano comunicare tra loro, in semplice risposta, non lasciano residui su qualsiasi filesystem.

A meno che non si stia utilizzando una presa o un tubo? Disponi delle autorizzazioni necessarie per rimuoverle, perché sono su un sistema NFS?

Spero che questo aiuti, Cordiali saluti, Tom.

+0

no questo non mi aiuta ... sto solo facendo un semplice progetto c per un nfs falso ... so cosa sono i semafori e la memoria condivisa ... voglio solo fare qualche prova sul mio codice e io è necessario rimuovere tutti i dati condivisi in un clic – simone

+0

@simone: dovresti aver dichiarato "falso nfs" nella tua domanda originale e ho sottolineato che hai capito i semafori e la memoria condivisa ... non è ancora chiaro su cosa sia "condiviso" dati"? – t0mm13b

+0

E anche l'inclusione del codice e per mostrare i compiti a casa per noi SO 'a vedere .... che sarebbe di aiuto anche ... – t0mm13b

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

o

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

Change $ USERNAME ad un vero e proprio nome utente.

58

Qui, salvare e provare questo script (kill_ipcs.sh) sulla vostra 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 

L'usiamo ogni volta che corriamo programmi IPCS nel server studente universitario. Alcune persone non lo fanno sempre di pulizia così ... ce n'è bisogno: P

+0

Grazie. Esattamente quello che stavo cercando. – Burkhard

+1

Non lo elimina tutti, anche se 'nattach' è diverso da zero? Che ne pensi di questo ?: ipcs -m | egrep "0x [0-9a-f] + [0-9] +" | awk '{if ($ 6 == 0) {stampa $ 2; }} '| xargs -n1 ipcrm -m' – Ben

+1

Sostituire i cicli for con 'xargs':' echo $ IPCS_S | xargs -n1 ipcrm -s'. – user1202136

1

Verificare se c'è qualcosa da eliminare con:

ipcs -a | grep `whoami` 

su Linux eliminarli tutti 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 

Per sarebbe:

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

per gentile concessione di di.uoa.gr

Verificare di nuovo se tutto è ok

Per cancellare tuoi SEMS/mem condiviso - supponendo sei un utente in una stazione di lavoro senza diritti di amministratore

5

questo funziona su Mac OS:

for n in `ipcs -b -m | egrep ^m | awk '{ print $2; }'`; do ipcrm -m $n; done 
1

Questo è come lo faccio in FreeBSD:

 
#!/usr/local/bin/bash 
for i in $(ipcs -a | grep "^s" | awk '{ print $2 }'); 
do 
     echo "ipcrm -s $i" 
     ipcrm -s $i 
done 
0

Oltre alla risposta di bvamos, secondo la documentazione l'uso di sem è deprecato:

NOME ipcrm - rimuovere una coda di messaggi, semafori impostare o memoria condivisa id SINOSSI ipcrm tasto [-M | -m id | -Q chiave | -q id | -S chiave | -s id] ... uso deprecato

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

rimuovere memoria condivisa

noi ipcrm -m per rimuovere un segmento di memoria condivisa dal 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 

o ipcrm -M per rimuovere un segmento di memoria condivisa dal tasto

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

rimuovere code di messaggi

noi ipcrm -q per rimuovere un segmento di memoria condivisa dal 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 

o ipcrm -Q per rimuovere un segmento di memoria condivisa dal tasto

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

rimuovere i semafori

us ipcrm -s per rimuovere un segmento semaforo dal 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 

o ipcrm -S per rimuovere un segmento semaforo dal tasto

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

per rimuovere tutti i segmenti di memoria condivisa su FreeBSD

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

per rimuovere tutti i semafori

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

1 linea farà tutto

Per coda di messaggi

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

ipcs -q darà i record di code di messaggi

sed "$ d; 1,2d " rimuoverà ultima riga vuota ("$ d") e le prime due righe di intestazione ("1,2d")

farà il resto, vale a dire la stampa e la rimozione utilizzando il comando "ipcrm -q" wrt il valore della colonna 2 (coz $2)

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

Spiega perché la tua risposta funziona e come. – Julian

0

rkhunter dammi un controllo per segmenti sospetti memoria condivisa [Avvertimento]

i cercando di pulire i segmenti di memoria con lo script messo sopra. ma ho di nuovo l'avviso

Problemi correlati