我试图创建一个基本上调用/执行另一个程序的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脚本。
感谢任何帮助。
答案 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