设为首页 收藏本站
查看: 588|回复: 0

[经验分享] 使用c和shell实现远程tomcat的重启备份脚本

[复制链接]

尚未签到

发表于 2017-2-7 11:11:58 | 显示全部楼层 |阅读模式
  下面是客户端程序
  #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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-338767-1-1.html 上篇帖子: [sso技术]cas在tomcat下的部署和定制(上篇) 下篇帖子: 如何用Tomcat和Openssl构建HTTPS双向认证环境(HTTPS客户端认证)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表