我正在尝试在 bash 3 中寻找超时的替代方案



我已经尝试了一种方法,使用超时来识别和退出服务器到RUNNING状态,否则在超时值退出观察RUNNING状态,不幸的是,其中一个服务器有bash版本3,不支持超时。

timeout 300s grep -q 'Server state changed to RUNNING' <(tail -f AdminServer.out)
if [ $? != 0];then
printf "n===> unable to bring up the server.please checkn"
else
printf "n===> server came to RUNNING staten"
fi

我已经尝试了以下操作,但是当日志出现时无法退出

( cmdpid=$BASHPID; (sleep 60; kill $cmdpid) & exec `grep -q 'Server state changed to RUNNING' <(tail -f AdminServer.out)`)

但它首先给出grep -q 'Server state changed to RUNNING' <(tail -f AdminServer.out)的命令行替换错误,然后给出kill使用错误,如下所示(似乎kill不起作用),Kill: usage: Kill [-s sigspec | etc....

  • 不幸的是,我无法升级服务器的bash版本,任何对此的指导都非常感激。谢谢!!

*server: suse distribution 2.6.32.12-0.7-default

考虑这样做:

data=$(
tail -f AdminServer.out & pid=$!

till=$[SECONDS+300]
while ((SECONDS<till)); do :; done
kill -9 $pid
)
grep -q 'Server state changed to RUNNING' <<< "$data" 
&& printf "n===> server came to RUNNING staten" 
|| printf "n===> unable to bring up the server.please checkn"

当我年轻的时候…在OSF1, DEC Alpha, SPARC…没有timeout命令,没有<(...)<<<操作符…我在积极地等待……

文件:timeout.sh

#! /bin/bash
PID="$1"
SEC="$2"
FILE="$3"
DATE_REF=$(date +%s)
DATE_MAX=$(( DATE_REF + ${SEC} ))
while ps -p "${PID}" >/dev/null 2>&1 && [[ $(date +%s) -lt ${DATE_MAX} ]] && ! grep OK "${FILE}" >/dev/null 2>&1; do
sleep 1
done
if grep OK "${FILE}" >/dev/null 2>&1; then
RET=0
else
RET=1
fi
if ps -p "${PID}" >/dev/null 2>&1; then
kill -9 "${PID}"
fi
rm -f "${FILE}"
exit $RET

这样使用:

nb_seconds_to_wait=5
tail -f my_log_file | grep -m 1 my_token_to_search && echo "OK" > my_flag_file &
timeout.sh $! nb_seconds_to_wait my_flag_file
if [[ $? -eq 0 ]]; then
echo "Found"
else
echo "Not found"
fi

我又试了一次,得出了以下结论,我在这里做了什么有害的事情吗?

( cmdpid=$BASHPID; ( sleep 10; if ps -p $cmdpid > /dev/null; then kill $cmdpid > /dev/null;fi ) & while `tail -f -n0 AdminServer.out | grep -q RUNNING`; do exit 0;done )
echo "proceeding with the rest of commands the previous command status is $?"

最新更新