これはうまくいきますが、私のやり方は少し愚かです。もっと良い方法がありますか?
for e in $(ipcs | awk '{print $2}'); do
[[ "$e" = "Semaphore" ]] && break
echo $e
ipcrm shm $e
done
echo $e outside for loop
for e in $(ipcs | awk '{print $2}'); do
[[ "$e" = "Message" ]] && break
echo $e
ipcrm -s $e
done
echo
exit 0
ipcsを実行するとこのようになります。
$ ipcs
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 262145 bob 600 393216 2 dest
0x00000000 2523138 bob 600 393216 2 dest
0x00000000 2555907 bob 600 393216 2 dest
0x00000000 3375108 bob 600 998400 2 dest
0x00000000 3440645 bob 666 40 1
------ Semaphore Arrays --------
key semid owner perms nsems
0x000005b1 262146 bob 600 6
------ Message Queues --------
key msqid owner perms used-bytes messages
これら2つのコマンドを定期的に実行する必要があります。
ipcrm -s $(ipcs | grep bob | awk '{printf "%s ",$2}')
ipcrm shm $(ipcs | grep bob | awk '{printf "%s ",$2}')
それで私もこのようなことができると思いました。
if [ `$(ipcs | grep Shared | awk '{print $2}')` == "Shared"]
ipcrm shm $(ipcs | grep bob | awk '{printf "%s ",$2}')
$ 2がセマフォに等しくなるまで最初のことをしたいと思います。
if [ `$(ipcs | grep Semaphore | awk '{print $2}')` == "Semaphore"]
ipcrm -s $(ipcs | grep bob | awk '{printf "%s ",$2}'
要約すると、「共有」を見た後、最初のifブロックを実行したいと思います。その後、「セマフォ」を見た後、2番目のifブロックが必要です。
ベストアンサー1
ipcrm shm <ids>
私が正しく理解したら、ユーザーbobのすべての共有メモリセグメントでこのコマンドを実行したいと思います。次に、ipcrm -s <ids>
ユーザーボブのすべてのセマフォ配列に対するコマンドがあります。
これを行うには、次のコマンドを使用します(スクリプトで繰り返す必要はありません)。
共有メモリセグメント部分の場合:
ipcrm shm $(ipcs -m | awk '$3=="bob" {printf "%s ",$2}')
セマフォ配列部分の場合:
ipcrm -s $(ipcs -s | awk '$3=="bob" {printf "%s ",$2}')
説明する:
ipcs
マンページから:
-m shared memory segments
-s semaphore arrays
ウィジェットは、3番目のフィールドがbobの場合にのみawk
IDを印刷します。