11 #define APP_NAME "untitled_ATU201console" 12 // 生成日志文件 13 #define LOG_FILE "/home/root/ljc/folder_daemon/untitled_ATU201console.log" 14 // 匹配成功 15 #define MATCH_RES "1" 16 // 启动守护应用的脚本 17 #define SCRIPT_FILE "start_daemon" 21 int daemon( int nochdir, int noclose) { 22 pid_t pid; 24 // 让init进程成为新产生进程的父进程 25 pid = fork(); 26 // 如果创建进程失败 27 if (pid < 0 ) { 28 perror( " fork " ); 29 return - 1 ; 30 } 31 // 父进程退出运行 32 if (pid != 0 ) { 33 exit( 0 ); 34 } 35 // 创建新的会话 36 pid = setsid(); 37 if (pid < - 1 ) { 38 perror( " set sid " ); 39 return - 1 ; 40 } 41 // 更改当前工作目录,将工作目录修改成根目录 42 if (! nochdir) { 43 chdir( " / " ); 44 } 45 // 关闭文件描述符,并重定向标准输入,输出合错误输出 46 // 将标准输入输出重定向到空设备 47 if (! noclose) { 48 int fd; 49 fd = open( " /dev/null " , O_RDWR, 0 ); 50 if (fd != - 1 ) { 51 dup2(fd, STDIN_FILENO); 52 dup2(fd, STDOUT_FILENO); 53 dup2(fd, STDERR_FILENO); 54 if (fd > 2 ) { 55 close(fd); 56 } 57 } 58 } 59 // 设置守护进程的文件权限创建掩码 60 umask( 0027 ); 62 return 0 ; 63 } 65 // 是否有匹配的字符,有则返回1,没有返回0 66 // src:源字符串 67 // dst:目标字符串 68 // len:源字符串被比较的长度 69 int match( char *src, char *dst, int len) { 70 syslog(LOG_INFO, " --------------------match1 " ); 72 int i = 0 ; 73 int j = 0 ; 74 int size_dst = 0 ; 76 // 获得目标字符串的长度 77 size_dst = strlen(dst); 78 // 如果目标字符串的长度大于len,返回失败 79 if (size_dst > len) { 80 syslog(LOG_INFO, " --------------------match11 " ); 81 return 0 ; 82 } 84 syslog(LOG_INFO, " --------------------match2 " ); 86 // 开始比较 87 for (i = 0 ; i < len; i++ ) { 88 for (j = 0 ; j < size_dst; j++ ) { 89 if (src[i + j] != dst[j]) { 90 break ; 91 } 92 } 93 if (j == size_dst) { 94 return 1 ; 95 } 96 } 98 syslog(LOG_INFO, " --------------------match3 " ); 100 return 0 ; 101 } 103 int main( int argc, char * argv[]) { 104 int fd = 0 ; 105 char buf[ 100 ]; 107 // 开启守护进程 108 daemon( 0 , 0 ); 110 while ( 1 ) { 111 syslog(LOG_INFO, " --------------------main1 " ); 113 // 打开日志 114 openlog(argv[ 0 ], LOG_CONS | LOG_PID, LOG_USER); 116 // 查看程序是否运行 117 // 新建输出文件 118 system( " touch " LOG_FILE); 119 // 获得程序ID 120 system( " ps -ef | grep " APP_NAME " | grep -v grep | wc -l >> " LOG_FILE); 121 // 打开输出文件 122 fd = open(LOG_FILE, O_CREAT | O_RDONLY, 0777 ); 123 // 清空缓存 124 memset(buf, 0 , 100 ); 125 // 读取全部 126 read(fd, buf, 100 ); 128 syslog(LOG_INFO, " --------------------main2 " ); 130 // 判断是否有程序文件运行 131 // if (match(buf, MATCH_RES, 1)) { 132 // syslog(LOG_INFO, "match success!!!"); 133 // } else { 134 // syslog(LOG_INFO, "match fail!!!"); 135 // // 运行程序 136 // system(SCRIPT_FILE); 137 // } 139 int res = memcmp(buf, MATCH_RES, 1 ); 140 syslog(LOG_INFO, " buf = %s\n " , buf); 141 syslog(LOG_INFO, " MATCH_RES = %s\n " , MATCH_RES); 142 syslog(LOG_INFO, " res = %d\n " , res); 143 if ( res == 0 ) { 144 syslog(LOG_INFO, " match success!!! " ); 145 } else { 146 syslog(LOG_INFO, " match fail!!! " ); 147 // 运行程序 148 // system(SCRIPT_FILE); 149 system( " /home/root/ljc/folder_daemon/untitled_ATU201console & " ); 150 } 152 syslog(LOG_INFO, " --------------------main3 " ); 154 // 休眠 155 sleep( 2 ); 156 // 删除输出文件 157 system( " rm " LOG_FILE); 158 // 休眠 159 sleep( 5 ); 160 } 161 // 关闭日志 162 closelog(); 164 return 0 ; 165 }

守护脚本1(待验证)

 1 //假设要监控的进程名称为test,TargetProcessName为启动该进程的脚本,status 有一系列的宏 对应可以检测。 
 2 while [ 0 ]
 3 do
 4     Result=$(ps -ef | grep -v grep |grep "test")
 5     if [ "" == "$Result" ]
 6     then
 7 RecordTime=$(date)
 8 echo  "Restar test" >>$LogFile
 9         nohup $TargetProcessName>>$LogFile &
10 sleep 2
11     fi
12     Result=
13 done

守护脚本2(待验证)

 1 #!/bin/bash
 2 # 直接上代码吧
 3 # watchdog.sh
 5 #定义映射表 k=进程号 v=作业
 6 declare -A mapper
 7 #进程号文件
 8 conf=dog.pid
11 function debug
12 {
13     echo $@
14 }
16 #param pid 进程号 
17 #使用ps命令查询该进程是否存在,如果不存在返回"gone",否则返回"stay"
19 function watch
20 {
21     local pid=$1
22     local index=`ps -ef|awk '{print $2}'|grep -P "^${pid}$"`
23     if [ "${index}None" = "None" ]; then
24         echo gone
25         return
26     fi
27     echo stay
28 }
30 #每过5秒钟检查一遍所有的进程,调用上面的watch
32 function dogit
33 {
34     while [ 1 ]
35     do
36         sleep 5
37         for pid in ${!mapper[@]}
38         do
39             debug pid:$pid
40             local t=`watch $pid`
41             debug "test result is $t!!!"
42             if [ "$t" = "gone" ]; then
43                 debug "$c with pid $pid was gone"
44                 loadscript ${mapper[$pid]}
45                 unset mapper[$pid]
46                 sed -i "/$pid/d" $conf
47             fi
48         done
49     done
50 }
52 #从作业文件加载需要守护的作业命令
54 function loadscript
55 {
56     local script=$@
57     debug script=$script
58     $script > /dev/null &
59     local pid=$!
60     mapper[$pid]=$script
61     echo $pid >> $conf
62 }
64 function clean
65 {
66     if [ -f $conf ]; then
67         while read line; do
68             if [ -n "$line" ]; then
69                 pid=`ps -ef|awk '{print $2}'|grep $line|grep -v 'grep'`
70                 if [ -n "${pid}" ]; then
71                     debug killing $pid
72                     kill $pid
73                 fi
74             fi
75         done < $conf
76     fi
77     echo > $conf
78     debug done!
79 }
81 function main
82 {
83     clean
84     local file=$1
85     if [ -f $file ]; then
86         while read line
87         do
88             loadscript $line
89         done < $file
90         dogit
91     else
92         echo "Not a file!"
93     fi
94 }
96 main $1;