我有一个运行长时间运行过程的脚本。 此过程目前在超时后停止。
#!/bin/bash
timeout 3600 ./longrunningprocess
我的问题是现在这个过程在达到超时之前没有返回,有时我需要提前停止它。
我需要什么?
我想并行启动其他脚本,定期检查我的longrunning进程是否应该停止。当这个bash脚本返回时,应该终止timeout命令。
知道如何实现这一目标吗?
有什么类似超时命令吗?没有时间跨度,但我可以启动一个脚本,这就像事件触发器一样?
E.g。
#!/bin/bash
fancyCommandKillsSecondCommandIfFirstCommandReturns "./myPeriodicScript.sh" "timeout 3600 ./longrunningprocess"
谢谢!
编辑:类似"并行开始2个进程,如果有人返回"也会工作......
编辑2:答案给了我一些关于脚本的想法:
#!/bin/bash
FirstProcess="${1}"
SecondProcess="${2}"
exec $FirstProcess &
PID1=$!
exec $SecondProcess &
PID2=$!
function killall {
if ps -p $PID1 > /dev/null
then
kill -9 $PID1
fi
if ps -p $PID2 > /dev/null
then
kill -9 $PID2
fi
}
trap killall EXIT
while true; do
if ! ps -p $PID1 > /dev/null
then
exit;
fi
if ! ps -p $PID2 > /dev/null
then
exit;
fi
sleep 5;
done
这种做我想要的。是否有任何本机功能或更好的方法来执行此操作?
答案 0 :(得分:0)
在后台启动longrunning进程并记住pid。
#!/bin/bash
timeout 3600 ./longrunningprocess &
long_pid=$!
./myPeriodicScript.sh
kill -9 ${long_pid}
答案 1 :(得分:0)
如果您解析 longrunningprocess 的输出以确定是否需要杀死该进程,那么您可以执行以下操作:
#!/bin/bash
FIFO="tmpfifo"
TIMEOUT=10
mkfifo $FIFO
timeout 100 ./longrun &> $FIFO &
PID=$!
while read line; do
echo "Parsing $line see if $PID needs to be killed";
if [ "$line" = "5" ]; then
kill $PID
fi
done < $FIFO
exit
这会将所有输出传输到FIFO并从该fifo开始读取。此外,它保留timeout
进程的PID,因此可以将其杀死。