使用c和shell实现远程tomcat的重启备份脚本

来源:互联网 发布:什么是数据字典 编辑:程序博客网 时间:2024/05/22 05:27

下面是客户端程序

#include <stdio.h>

#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>

#define SERVPORT 6666  //定义的端口号
#define MAXDATASIZE 1024  最大字节数
#define SERVER_IP "10.10.10.158"   服务器ip地址

int main(int argc, char* argv[]) {
    int sockfd, recvbytes;
    char buf[MAXDATASIZE];
    struct hostent *host;
    char buffer[MAXDATASIZE];
    struct sockaddr_in serv_addr;
    char name[100];


   //提示输入要对那个tomcat进行操作,由于同一台机器安装了不止一个tomcat项目

   printf("请输入要操作的tomcat路径\n");
   scanf("%s",&name);

  while(1){  //为了连续输入操作命令所以使用了死循环

      bzero(buffer, MAXDATASIZE);  //每次发送完成进行清零操作

       //创建一个socket服务

      if (( sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
         perror("socket error!");
         exit(1);

      }

      bzero(&serv_addr,sizeof(serv_addr));
      serv_addr.sin_family = AF_INET;
      serv_addr.sin_port = htons(SERVPORT);
      serv_addr.sin_addr.s_addr= inet_addr(SERVER_IP);


      //建立一个连接

     if (connect(sockfd, (struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) == -1) {
        perror("connect error!");
        exit(1);
     }

     printf("请输入要执行的命令:\n");

     scanf("%s",&buf);

     //输入一个命令,如果输入的值是close就退出

     if(strcmp(buf,"close")==0){
        close(sockfd);
        return 0;

     }

     //拼接tomcat的路径和命令一起发送

     strcat(buffer,name);

     strcat(buffer," ");

     strcat(buffer,buf);

     write(sockfd,buffer, sizeof(buffer));

     //接受服务器返回的消息内容

     if ((recvbytes = recv(sockfd, buf, MAXDATASIZE,0)) == -1) {
        perror("recv error!");
        exit(1);
     }
     buf[recvbytes] = '\0';
     printf("客户端返回的消息:\n %s",buf);
  }
    close(sockfd);
    return 0;

}


下面是服务端程序

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
 
#define SERVPORT 6666   //端口号
#define BACKLOG 10
#define MAXSIZE 1024
 
int main() {
    int sockfd,client_fd;
    struct sockaddr_in my_addr;
    struct sockaddr_in remote_addr;
    FILE * fp;
    char buffer[80];
  
    //创建套接字
    if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) {
        perror("socket create failed!");
        exit(1);
    }
 
    //绑定端口地址
    my_addr.sin_family      = AF_INET;
    my_addr.sin_port        = htons(SERVPORT);
    my_addr.sin_addr.s_addr = INADDR_ANY;
    bzero(&(my_addr.sin_zero),8);
    if (bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr)) == -1) {
        perror("bind error!");
        exit(1);
    }
 
    if (listen(sockfd, BACKLOG) == -1) {
        perror("listen error");
        exit(1); 
    }
 
    while (1) {
        int sin_size = sizeof(struct sockaddr_in);    
        char shell[100] =" ";
        if ((client_fd = accept(sockfd, (struct sockaddr*)&remote_addr,&sin_size)) == -1) {
            perror("accept error!");
            continue;
        }

       //打印客户端的ip地址和端口号
        printf("Received a connection from %s\n", (char*)inet_ntoa(remote_addr.sin_addr));
        if (!fork()) {
            int rval;
            char buf[MAXSIZE];   
            if ((rval = read(client_fd, buf, MAXSIZE)) < 0) {
                perror("reading stream error!");
                continue;
            }

             //输出客户端发送的消息
            printf("客户端发送的消息%s\n",buf);

            //将本地的脚本和客户端发送的命令进行拼接
           strcat(shell,"/home/shell/tomcat_online.sh");     

            strcat(shell," ");
            strcat(shell,buf);

             //执行shell并且将执行结果返回给客户端
            fp=popen(shell,"r");
            while(fgets(buf,sizeof(buf),fp) != NULL )
            {
                 strcat(buf,"\n");
                 if (send(client_fd,buf,strlen(buf),0) == -1) perror("send error!");
             }
            pclose(fp);
            close(client_fd);
            exit(0);
        } 
        close(client_fd);
    }
    return 0;
}


调用shell 服务器端tomcat_online.sh

#!/bin/sh
Project_name=$1   
Command=$2
my_Back="webapps_backup"
case "$Command" in
      start)
            export JAVA_HOME=/usr/local/java/jdk1.6.0_23  //导入java环境变量,tomcat启动需要
            cd $Project_name   //客户端传过来的tomcat路径
            rm -rf work/*    //情空tomcat下的work目录
            $Project_name/bin/startup.sh >/dev/null  //启动tomcat并将返回结果输出到空设备
            sleep 3
            tompid=`ps -ef|grep $Project_name|grep -v "grep"|grep -v "$0" |awk '{print $2}'` 

            //判断tomcat是否启动成功,如果tomcat进程存在说明启动成功,或者启动失败,当然这也是相对的,也有tomcat进程存在,但是启动却失败的              
            if ( [ -n "$tompid" ] );then
                 echo -e "\033[32m$Project_name启动成功\033[0m" 
            else
                 echo -e "\033[31m$Project_name启动失败,请重新执行一次命令\033[0m"
           fi      
            ;;
       stop)

            //获取tomcat的进程号
            pidlist=`ps -ef|grep $Project_name|grep -v "grep"|grep -v "$0" |awk '{print $2}'`
            #echo "tomcat Id list :$pidlist"
            kill -15 $pidlist
            #echo "KILL $pidlist"
            sleep 10

           //暂停10秒后检查tomcat的进程号是否还存在
            tompid=`ps -ef|grep $Project_name|grep -v "grep"|grep -v "$0" |awk '{print $2}'`              
            if ( [ -n "$tompid" ] && [ $tompid ==  $pidlist ] );then
                 echo -e "\033[31m$Project_name停止失败,请重新执行一次命令\033[0m"
            else
                   #/usr/bin/tail -1000  $Project_name/logs/catalina.out 
                   echo -e "\033[32m$Project_name停止成功\033[0m" 
            fi
   ;;
        status)
            tompid=`ps -ef|grep $Project_name|grep -v "grep"|grep -v "$0" |awk '{print $2}'`
            if ( [ -n "$tompid" ] );then
                   echo -e "\033[32m$Project_name运行中......\033[0m" 
            else
                   echo -e "\033[32m$Project_name停止中.....\033[0m" 
            fi
            ;;
        restart)
                export JAVA_HOME=/usr/local/java/jdk1.6.0_23
                pidlist=`ps -ef|grep $Project_name|grep -v "grep"|grep -v "$0"|awk '{print $2}'`
                # echo "tomcat Id list :$pidlist"
                kill -15 $pidlist
                #echo "KILL $pidlist:"
                #echo "stop success"
                #echo "start tomcat"
                cd $Project_name
                 rm -rf work/*
                cd bin
                sleep 10
                ./startup.sh 
                 sleep 3
                 /usr/bin/tail -100  $Project_name/logs/catalina.out
                 echo -e "\033[32m$Project_name重启成功\033[0m"
                 ;;
           backup) 
                 cd $Project_name
                 before_num=`/bin/ls webapps_backup/ |wc -l`
                 `/bin/find  -type d  -name "webapps_[0-9]*" -mtime +10 | xargs rm -fr` 
                 #echo $my_Back
                 if [ ! -d "$my_Back" ]; then
                    `/bin/mkdir -p $my_Back`
                  fi
                  /bin/cp -frp webapps  $my_Back/webapps_$(/bin/date -d "today" +"%Y%m%d_%H%M")
                  after_num=`/bin/ls webapps_backup/ |wc -l`
                  if [ $after_num -eq $(($before_num+1)) ];then
                       echo -e "\033[32m$Project_name备份成功\033[0m"
                   else 
                        echo -e "\033[31m$Project_name备份失败,请重新备份\033[0m"     
                   fi
                   ;;
           rollback) 
                   file_name=`/bin/ls -ltc $Project_name/$my_Back|sed -n 2p|awk '{print $8}'`
                   #echo "$Project_name/$my_Back/$file_name"
                   #echo $file_name
                   /bin/cp -frp $Project_name/$my_Back/$file_name   $Project_name/$my_Back/webapps
                   /bin/cp -frp $Project_name/$my_Back/webapps $Project_name
                   rm -fr $Project_name/$my_Back/webapps
                   cd $Project_name
                   if ([ "`find  ./ -maxdepth 1  -type d -cmin -1|sed -n 1p`"  == './webapps' ]);then
                         echo -e "\033[32m$Project_name回滚成功\033[0m"
                   else 
                         echo -e "\033[31m$Project_name回滚失败,请重新执行一次\033[0m"        
                   fi
                  ;;
               *)
                    echo "Usage: $0 {start|stop|restart|status|backup|rollback}" 
                    exit 1
esac
            
   exit 0