Bash 用父母来杀死睡眠';s PID不在循环中工作
我有一个文件如下所示:Bash 用父母来杀死睡眠';s PID不在循环中工作,bash,loops,sleep,pid,kill,Bash,Loops,Sleep,Pid,Kill,我有一个文件如下所示: #!/bin/bash echo $$ > pid while true; do echo "something" sleep 10s done | lemonbar pkill -P $(cat pid) -f "sleep 10s" 我想通过这样的功能来消除睡眠: #!/bin/bash echo $$ > pid while true; do echo "something" sleep 10s done |
#!/bin/bash
echo $$ > pid
while true; do
echo "something"
sleep 10s
done | lemonbar
pkill -P $(cat pid) -f "sleep 10s"
我想通过这样的功能来消除睡眠:
#!/bin/bash
echo $$ > pid
while true; do
echo "something"
sleep 10s
done | lemonbar
pkill -P $(cat pid) -f "sleep 10s"
如果我将sleep移出循环,上面的命令会起作用,但是在循环中它什么也不做。我遗漏了什么?Bash循环在孩子的时候启动新的进程id。shell变量$PPID应表示父PID。然而,我也读了你之前的问题,我认为更好的问题应该是你真正想要完成什么?所有这些都有股骇人的味道…您识别了父pid,但没有告诉
pkill
要杀死哪个子进程。试试pkill-P$(@alvits My bad.I实际上是用pkill-P$(cat-pid)运行的sleep
。只是忘记了帖子中的那一部分。请注意使用了-f
,这是您没有的。它告诉pkill
匹配整个命令行,而不仅仅是进程名。而且您的命令在我的Oracle Enterprise Linux 6.4上运行良好。这很奇怪。您确定读取的pid
文件正确吗?什么bash
版本和您在哪个平台上?您是否以同一用户的身份运行脚本和pkill
命令?我正在将循环的结果传送到lemonbar。我希望它每5秒更新一次,或者每当我单击按钮时更新一次(这将触发命令以重新启动循环)@Marcel,在你的帖子中是10秒,但你一直在说5秒。也许这就是上面的编辑在你的案例中不起作用的原因。也许你试图杀死sleep 10s
,但你的脚本正在运行sleep 5s
。因为上面的代码在我的linux上工作。@Marcel,请注意pkill“sleep 10s”如果没有-f
将永远无法工作,因为sleep 10s
不是进程名,sleep
是。我有-f
和sleep 10s
。我意外地放了5,因为我计划在它工作后加速它。将每个循环的pid发送到pid文件会更有意义。$!represents最后执行的命令的PID