这有效,但我这样做的方式有点愚蠢。有一个更好的方法吗?
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
Run Code Online (Sandbox Code Playgroud)
这就是我运行 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
Run Code Online (Sandbox Code Playgroud)
我需要定期运行这两个命令。
ipcrm -s $(ipcs | grep bob | awk '{printf "%s ",$2}')
ipcrm shm $(ipcs | grep bob | awk '{printf "%s ",$2}')
Run Code Online (Sandbox Code Playgroud)
所以我想我可以做这样的事情。
if [ `$(ipcs | grep Shared | awk '{print $2}')` == "Shared"]
ipcrm shm $(ipcs | grep bob | awk '{printf "%s ",$2}')
Run Code Online (Sandbox Code Playgroud)
我想做第一个行为,直到 $2 等于 Semaphore。
if [ `$(ipcs | grep Semaphore | awk '{print $2}')` == "Semaphore"]
ipcrm -s $(ipcs | grep bob | awk '{printf "%s ",$2}'
Run Code Online (Sandbox Code Playgroud)
所以总而言之,我希望在看到“共享”后运行第一个 if 块。然后我想要第二个 if 块,在我看到“信号量”之后。
如果我理解正确,您想为ipcrm shm <ids>
用户 bob 的所有共享内存段运行该命令。然后ipcrm -s <ids>
是用户 bob 的所有信号量数组的命令。
要完成此操作,请使用以下命令(您不必在脚本中循环):
对于共享内存段部分:
ipcrm shm $(ipcs -m | awk '$3=="bob" {printf "%s ",$2}')
Run Code Online (Sandbox Code Playgroud)
对于信号量数组部分:
ipcrm -s $(ipcs -s | awk '$3=="bob" {printf "%s ",$2}')
Run Code Online (Sandbox Code Playgroud)
解释:
从ipcs
联机帮助页:
-m shared memory segments
-s semaphore arrays
Run Code Online (Sandbox Code Playgroud)
该awk
部件仅在第三个字段为 bob 时才打印 ID。
归档时间: |
|
查看次数: |
604 次 |
最近记录: |