前企业邮箱杀rpc的shell,都快忘记了,做个备份

jackxiang 2008-9-23 18:31 | |
问题提出:为何多线程?  答:为了问题得到有效解决.
什么问题:由于rpc僵死,ps aux|gep rpc  rpc进程还在,但是它已经死掉失效了,但系统也无法知道,我们只好去调用rpc里面的一个函数看返回结果。
问:为何不用一个进程去判断而要用多线程?
答:一个进程掉用rpc里面的一个函数,在rpc死后如果调用,调用者无法退出终端,也死在那儿了.
问:为何不用多进程?
答:多进程不太熟悉,尝试失败。
最后:选择了多线程。。。
多线程的大致流程:
一个线程睡觉,一个干事情,干不动事情,睡觉的线程杀了干事情的线程。。。^_^(有趣)

#!/bin/sh

state=`/usr/local/bin/test_rpc_server_62 afeng@afeng.sina.net`;

if [ "$state" != "OK" ]; then
ps auxwww |grep rpc |awk '{ print "kill -9 " $2 }' |sh
if [ -e /usr/local/etc/rc.d/entplatform_rpcserver.sh ]; then
sh /usr/local/etc/rc.d/entplatform_rpcserver.sh
else
ps auxwww |grep rpc |awk '{ print "kill -9 " $2 }' |sh
cat /etc/rc.local |grep rpc |sh
fi
echo "rpc bad, restart.";
else
echo "rpc ok.";
fi


shell如,一行搞定:
grep '|'`date +20%y-%m-%d`' ALL  FUNISHED! |' /data0/daemon_log/popularity/addScoreOnline.log  >>  /data0/daemon_log/popularity/addScoreOnlineSh.log



shell字符串相连:


A=EDIT
N=1
B=$A$N
echo $B



c程序:


/* multiple thread programming in freebsd
  *author : xiangdong2,zhirui
  *E-mail : xiangdong2@staff.sina.com.cn zhirui@staff.sina.com.cn
*/
#include <pthread.h>
#include <stdio.h>
#include <sys/time.h>
#include <string.h>

//////////////xiangdong/////////////////////////
#include "clientlib.h"
#include "clnt_ent_rpcserver.h"
////////////////////////////////////////////////

pthread_t thread[2];
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;
pthread_t th;

char emailAddr[128] = {0};
int ret = 0;

void* rpcCheck(void *arg);

void *thread1()
{
  sleep(1);
  if(ret <= 0)
  {
    printf("The Rpc be down..........\n");
    pthread_cancel(th);
    pthread_exit(NULL);
  }else{

    switch(ret)
    {
    case QERR_OK:
      printf("OK\n");
    break;

    case QERR_SERVER:
      printf("QERR_SERVER\n");
    break;

    case QERR_MEMORY:
      printf("QERR_MEMORY\n");
    break;

    case QERR_HASH:
      printf("QERR_HASH\n");
    break;

    case QERR_MYSQL:
      printf("QERR_MYSQL\n");
    break;

    case CANTCONNECTSERVER:
      printf("CANTCONNECTSERVER\n");
    break;
    
    default:
      printf("Other error\n");
    break;
    }
      }
  
    pthread_exit(NULL);
}

void thread_create(void)
{
        int temp;
        memset(&thread, 0, sizeof(thread));          //comment1

        /*创建线程*/
        if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0)       //comment2
  {
    printf("线程1创建失败!\n");
  }
  else
  {
    //printf("线程1被创建\n");
  }

        if((temp = pthread_create(&thread[1], NULL, rpcCheck, NULL)) != 0)  //comment3
                printf("线程2创建失败!\n");
  /*        
    else
                printf("线程2被创建\n");
  */

}

void thread_wait(void)
{
        
  if(thread[0] !=0)
    {    
  
    pthread_join(thread[0],NULL);
        
    }

}

void* rpcCheck(void* arg)
{

  th=pthread_self();
  ENTERPRISE ent;
  ENTDOMAIN dm;
  EMAIL em;
  ENTINFO ei;
  char email[128] = {0};
  snprintf(email, sizeof(email) - 1, "%s", emailAddr);
  em.projectid = ent.projectid = dm.projectid = 1;
  em.method = BY_EID + 1;
  strcpy(em.email, email);
  pthread_detach(pthread_self());
  pthread_mutex_lock(&mut);
  ret = ent_rpc_getemail(&em);
  pthread_mutex_unlock(&mut);
}



int main(int argc, char* argv[])
{
  //帮助提示
  if(argc != 2)
  {
    printf("用法:%s <邮件地址>\n", argv[0]);
    printf("返回值说明:\n");
    printf("OK         --- 有效的邮件地址\n");
    printf("QERR_SERVER   --- RPC服务器内部错误\n");
    printf("QERR_MEMORY   --- RPC内存错\n");
    printf("QERR_HASH   --- RPC内部HASH错\n");
    printf("QERR_MYSQL   --- 无效的邮件地址\n");
    printf("CANTCONNECTSERVER 连接RPC服务器失败\n");
    return 0;
  }

  snprintf(emailAddr, sizeof(emailAddr) - 1, "%s", argv[1]);

  /*用默认属性初始化互斥锁*/
  
  pthread_mutex_init(&mut,NULL);
  //printf("我是主函数哦,我正在创建线程,呵呵\n");
  thread_create();
  //printf("我是主函数哦,我正在等待线程完成任务阿,呵呵\n");
  thread_wait();
  return 0;
}

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/1273/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2009-4-21 15:36
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]