好吧,我已经摸索了足够长的时间了。我正在为一个应用程序编写init脚本,在使用stop函数时遇到了困难。在我的第一种情况下,它似乎总是匹配的,并且在服务实际关闭时永远不会正确报告。
我的代码:
#!/bin/bash -x
. /etc/rc.d/init.d/functions
LOCKFILE=/var/lock/subsys/java
logger="/usr/bin/logger -t rc.local"
log_msg_start="Starting java Services:"
log_msg_stop="Stopping java Services:"
VAR=$(/usr/sbin/lsof -i :8080 | awk 'FNR == 2 {print $10}')
VAR2="(LISTEN)"
以上,如果服务仍在运行,我希望VAR的输出为"(LISTEN)"。
代码继续。。。
stop(){
echo -n "$log_msg_stop"
cd /opt/java/bin/ ; ./java stop &>/dev/null &
sleep 10
rm -rf $LOCKFILE
if [ "$VAR" == $VAR2 ]
then echo "Still running, try again"
elif [ "$VAR" != $VAR2 ]
then echo "Service is stopped"
fi
echo
}
看起来很简单,对吧?
这是我运行调用时的调试输出。
+ LOCKFILE=/var/lock/subsys/java
+ logger='/usr/bin/logger -t rc.local'
+ log_msg_start='Starting java Services:'
+ log_msg_stop='Stopping java Services:'
++ /usr/sbin/lsof -i :8080
++ awk 'FNR == 2 {print $10}'
+ VAR='(LISTEN)'
+ VAR2='(LISTEN)'
+ case "$1" in
+ stop
+ echo -n 'Stopping java Services:'
Stopping java Services:+ cd /opt/java/bin/
+ sleep 10
+ ./java stop
+ rm -rf /var/lock/subsys/java
+ '[' '(LISTEN)' == '(LISTEN)' ']'
+ echo 'Still running, try again'
Still running, try again
+ echo
+ exit 0
澄清要点:
1) 此行:
cd /opt/java/bin/ ; ./java stop &>/dev/null &
是一个链接的命令,正在cd’ing到文件夹,然后运行/java停止。我这样做是因为它不起任何其他作用。仅供参考,我正在以与启动函数相同的方式运行它,它运行得很好。
2) 脚本的停止功能部分的概念是处理一个不总是在第一次关闭的有缺陷的服务。因此,"仍在运行,再试一次"。一旦我让脚本的这一部分检测到正确的条件,我就要进行while循环,使其保持运行,直到它看到正确的条件。
3) 我还尝试将服务的状态输出到一个文本文件中,并对其进行grep以使其内容与之匹配。那样做对行为没有影响。
4) 此服务使用以下格式运行:
service java start
service java stop
service java status
仅供参考,"java"正被我正在使用的实际程序所取代。
此外,在尝试停止服务之前,您正在脚本的开头设置$VAR
。这将永远不会看到您的stop
功能已停止服务。–Etan Reisner