退出在我的脚本中调用的程序

时间:2018-03-01 15:33:31

标签: bash

我试图创建一个基本上调用/执行另一个程序的bash脚本,睡5秒钟,杀死所述程序,再次睡眠5秒钟,最后重启整个循环。

这是我创建脚本的尝试:

#! /bin/bash

while true
do

someOtherProgram -options..etc.
PID=$!
echo "someOtherProgram initiated"
sleep 5
kill $PID
echo "someOtherProgram killed"
sleep 5
echo "restarting loop"

done

使用此脚本,它可以启动someOtherProgram但它会卡在那里。我甚至不会在终端上看到我的回音"someOtherProgram initiated"

我知道这是一个简单易懂的解决方案,但我刚开始时并不熟悉bash脚本。

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

您的问题是$!

"Expands to the process ID of the job most recently 
 placed into the background"

您不是someOtherProgram -options..etc.的背景。为此,您需要:

someOtherProgram -options..etc. &

(注意:最后的&符号&

目前您的PID为空。您可以通过尝试输出它来轻松确认这一点,例如

echo "someOtherProgram initiated (PID: $PID)"

您可以在$!内的"Special Parameters""JOB CONTROL"部分下找到有关使用man bash和后台处理(异步运行)的详细说明。

答案 1 :(得分:0)

Rankin's answer是正确的,因为它显示了代码失败的原因。但是,如果需要另一种方法,那就是timeout命令,这有时更方便,因为它避免了需要跟踪变量。这是循环的样子:

while true
do
    ( timeout 5 someOtherProgram -options..etc. &
      echo "someOtherProgram initiated"
      wait ; )
    echo "someOtherProgram killed"
    sleep 5
    echo "restarting loop"
done

不幸的是,代码的效率低于使用变量,特别是因为它使用shell括号()wait。如果首先打印 initialize 消息,则更简单:

while true
do
    echo "someOtherProgram initializing..."
    timeout 5 someOtherProgram -options..etc.
    echo "someOtherProgram killed"
    sleep 5
    echo "restarting loop"
done