我已经尝试了一种方法,使用超时来识别和退出服务器到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 $?"