一.

一个php脚本,经常跑了好几个小时,然后莫名其妙的挂掉,不胜其烦。在没有找到真正的原因之前,只好先写一个daemon作用的shell script来monitor,在发现脚本挂掉后,重启脚本.

 

以下是在chinaunix找到的相关内容,汇集了各位大神们的意见:

http://bbs.chinaunix.net/thread-1487627-1-1.html

 

============================================================

请教如何写一个shell监控我的一个进程状态,死了重启

Python代码 #/bin/sh 

1. while true; do   
2.                 count=`ps -fe |grep "main" | grep -v "grep"`   
3.                 if [ "$?" != "0" ]; then   
4.     echo ">>>>no main,run it"  
5.     else  
6.     echo ">>>>main is running"  
7.     fi   
8.     sleep 2  
9. done
[python] view plaincopy
<EMBED id=ZeroClipboardMovie_1 height=18 name=ZeroClipboardMovie_1 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=18 src= wmode="transparent" flashvars="id=1&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
1. #/bin/sh  
2. while true; do  
3. "main" | grep -v "grep"`  
4. if [ "$?" != "0" ]; then  
5. ">>>>no main,run it"  
6. else  
7. ">>>>main is running"  
8.     fi  
9. 2  
10. done

 
---------------------------------分割线----------------------------------------------
按照2楼的方法,我的板子里没有wc,也没有crontab

我在终端上执行这个脚本./test,能正确检测,
但是我执行./test &,不管main有没有,都是输出no main,run it

---------------------------貌似解决了------------------------------------
在done后面加 &

============================================================

 

 整体思路看来就是:实现查找进程(ps -ef|grep命令),截取进程字符串关键信息判断是否为空(字符串赋值),执行重启命令(为空时)或跳过(不为空时),用crontab或者循环语句实现定时判断。

 

发现一个哥们儿写的比我好,拿过来给大家借鉴一下。

 

C代码 #!/bin/bash 

1. CheckProcess()   
2. {   
3.         if [ "$1" = ""];   
4.         then   
5.                 return 1   
6.         fi   
7.   
8.     PROCESS_NUM=`ps -ef | grep "$1" | grep -v "grep" | wc -l`   
9.     if [ $PROCESS_NUM -eq 1 ];   
10.     then   
11.         return 0   
12.     else  
13.         return 1   
14.     fi       
15. }    
16.   
17. while [ 1 ] ; do  
18.     CheckProcess "./a.out"  
19.     CheckQQ_RET=$?   
20.     if [ $CheckQQ_RET -eq 1 ];   
21.     then   
22.      killall -9 a.out   
23.      exec ./a.out &   
24.     fi   
25.     sleep 1   
26. done
[c] view plaincopy
<EMBED id=ZeroClipboardMovie_2 height=18 name=ZeroClipboardMovie_2 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer width=18 src= wmode="transparent" flashvars="id=2&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
1. #!/bin/bash  
2. CheckProcess()  
3. {  
4. if [ "$1" = ""];  
5.         then  
6. return 1  
7.         fi  
8.   
9. "$1" | grep -v "grep" | wc -l`  
10. if [ $PROCESS_NUM -eq 1 ];  
11.     then  
12. return 0  
13. else  
14. return 1  
15.     fi      
16. }   
17.   
18. while [ 1 ] ; do  
19. "./a.out"  
20.     CheckQQ_RET=$?  
21. if [ $CheckQQ_RET -eq 1 ];  
22.     then  
23.      killall -9 a.out  
24.      exec ./a.out &  
25.     fi  
26.     sleep 1  
27. done

 

 

二.

然后, if 的真正模型是:

if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi

其实, bash中的help if就给了你正确的答案, 但我不知道什么原因无数人就是忽略了它, 而非常多的bash教学资料中都采用了本文开头提出的那种模型来告诉你关于if 结构的事.

注意: [ "$1" = "-a" ] 只一个命令, [ 是命令名!, "$1"是第一个参数, =是第二个参数, "-a"是第三个, ]是第4个. 是[这个命令, 而不是bash本身在报怨 [ "$1" = "-a"] 这样的结构造成的错误, 因为[这个命令对它的参数有所期望, 它期望最后一个参数是 ], 而你用"-a"] 这种连写的形式, 它得到的就只有3个参数: $1, = 和 -a].

 

三.

在运行该脚本时,发现如下错误:syntax error near unexpected token `else'

问题解决:

1.使用 sh -x change.sh看看哪个地方的有问题

2.使用 dos2unix 字符转换工具 convert file formating

3.如果还没有解决,那只能手动将内容重写一遍

 

老外这么说:

Solution:
The customer in this case had downloaded the script off our website from a Win95 box,
and then moved the file to the Linux box. This caused DOS ASCII end-of-line characters
to be placed in the script. The solution is to download the script from the Linux box, as
moving it from the Windows environment will always place undesireable characters in
the script.

Or ftp the file in ASCII mode when transfering from Win95 to Linux.