在集群上跑程序的人都知道要编辑一个节点列表文件来说明在哪些机器上启动进程,以及在某个机器上启动的进程的数量,最典型的情况是mpi。但是如果机器的数量过大,比如有500个节点的机群,这样要维护这个文件也是一件比较头疼的事情。

维护节点列表文件,主要是进行三个操作:创建列表,删除某些节点,修改某些节点。接下来就可以用C或者Python实现一个具备这三种功能的小程序了。今天上午实现了一个,代码贴在这里。

  1. /**************************************************************************************************************************
  2. * Name: md                                                                                                                *
  3. * Author: Chaos Lee                                                                                                       *
  4. * Date: 2012-06-07                                                                                                        *
  5. * Description: This program is used to create and edit a host file. It provides three simple functions to accomplish this.*
  6. *              (1) To create a host file: mh -p prefix_name -f file_name -l num1-num2 num3 num4-num5                      *
  7. *                  Above command will create a host file whose name is file_name,containing a machine name list in format *
  8. *                  as bellow:                                                                                             *
  9. *                  prefix_namenum1                                            *
  10. *                  ...                                                                                                    *
  11. *                  prefix_namenum2                                                                                        *
  12. *                  prefix_namenum3                                                                                        *
  13. *                  prefix_namenum4                                                                                        *
  14. *                  ...                                                                                                    *
  15. *                  prefix_namenum5                                                                                        *
  16. *              (2) To delete some machine names from the host file: mh -f file_name -d num1-num2 num3 num4-num5.          *
  17. *                  Above command will delete prefix_namenum1,...,prefix_namenume2,prefix_namenum3,prefix_namenum4,...     *
  18. *                  ,prefix_namenum5 from the file indicated by the file_name                                              *
  19. *              (3) To modify some machine names from the host file: mh -f file_name -m num1 num2 num3 num4                *
  20. *                  Above command will change prefix_namenum1 to prefix_namenum2,prefix_namenum3 to prefix_namenum4.       *
  21. **************************************************************************************************************************/
  22. #include<stdio.h>
  23. #include<string.h>
  24. #include<ctype.h>
  25. #include<stdlib.h>
  26. typedef enum com_type_tag {create,delete,modify} com_type;
  27. typedef int status;
  28. #define false 0
  29. #define true 1
  30. #define EXIT_SUCCESS 0
  31. #define BAD_FORMAT  -1
  32. #define MAX_NODE_NUMBER 999
  33. char machine_names[MAX_NODE_NUMBER][20];
  34. int names_number = 0;
  35. #define XXXX  do{\
  36. printf("FILE:%s LINE:%d\n",__FILE__,__LINE__); \
  37. fflush(stdout); \
  38. }while(0);
  39. int find_minus(char *nums)
  40. {
  41. int len = strlen(nums);
  42. int i;
  43. for(i=0;i<len;i++)
  44. {
  45. if(nums[i]=='-')
  46. {
  47. return i;
  48. }
  49. }
  50. return -1;
  51. }
  52. status check_cd_num(char * nums)
  53. {
  54. int minus_pos = find_minus(nums);
  55. int i = 0;
  56. if(-1 == minus_pos)
  57. return check_m_num(nums);
  58. nums[minus_pos] = '\0';
  59. if(false == check_m_num(nums) || false == check_m_num(nums+i+1) )
  60. return false;
  61. nums[minus_pos] = '-';
  62. return true;
  63. }
  64. status check_m_num(char * num)
  65. {
  66. int i=0;
  67. int len = strlen(num);
  68. if(len>3 || len==0)
  69. return false;
  70. for(i=0;i<len;i++)
  71. {
  72. if( !isdigit(num[i]) )
  73. return false;
  74. }
  75. return true;
  76. }
  77. status check_num_list(int type,int argc,char *argv[])
  78. {
  79. int i;
  80. int start=4;
  81. if(type == create || type == delete)
  82. {
  83. if(type == create)
  84. start = 6;
  85. for(i=start;i<argc;i++)
  86. {
  87. status res = check_cd_num(argv[i]);
  88. if(!res)
  89. return res;
  90. }
  91. }
  92. else if(type == modify)
  93. {
  94. int counter = 0;
  95. for(i=start;i<argc;i++)
  96. {
  97. status res = check_m_num(argv[i]);
  98. if(!res)
  99. return res;
  100. counter++;
  101. }
  102. if(counter & 1)
  103. return false;
  104. }
  105. else
  106. {
  107. printf("command type is wrong.\n");
  108. return false;
  109. }
  110. return true;
  111. }
  112. com_type analyze_command(int argc,char *argv[])
  113. {
  114. int i=0;
  115. com_type type;
  116. if( 0 == strcmp(argv[1],"-p") && 0 == strcmp(argv[3],"-f") && 0 == strcmp(argv[5],"-l") )
  117. type = create;
  118. else if(0 == strcmp(argv[1],"-f")  && 0 == strcmp(argv[3],"-d") )
  119. type = delete;
  120. else if(0 == strcmp(argv[1],"-f") && 0 == strcmp(argv[3],"-m"))
  121. type = modify;
  122. else
  123. {
  124. printf("command in bad format.\n");
  125. exit(BAD_FORMAT);
  126. }
  127. if(false == check_num_list(type,argc,argv))
  128. {
  129. printf("number list in bad format\n");
  130. exit(BAD_FORMAT);
  131. }
  132. return type;
  133. }
  134. void get_range(char *nums,int * num_min,int * num_max)
  135. {
  136. int minus_pos = find_minus(nums);
  137. if( -1 == minus_pos )
  138. *num_min = *num_max = atoi(nums);
  139. else
  140. {
  141. *num_min = atoi(nums);
  142. *num_max = atoi(nums+minus_pos+1);
  143. }
  144. }
  145. status create_list(int argc,char *argv[])
  146. {
  147. int i,num_min,num_max,j;
  148. FILE * fp;
  149. //printf("filename = %s\n",argv[4]);
  150. fp  = fopen(argv[4],"w");
  151. if(NULL == fp)
  152. {
  153. printf("creating file %s error.\n",argv[4]);
  154. return false;
  155. }
  156. for(i = 6;i<argc;i++)
  157. {
  158. get_range(argv[i],&num_min,&num_max);
  159. //printf("num_min=%d num_max=%d\n",num_min,num_max);
  160. for(j=num_min;j<=num_max;j++)
  161. sprintf(machine_names[names_number++],"%s%03d",argv[2],j);
  162. }
  163. for(i=0;i<names_number;i++)
  164. {
  165. fprintf(fp,"%s\n",machine_names[i]);
  166. }
  167. fclose(fp);
  168. return true;
  169. }
  170. status delete_list(int argc,char *argv[])
  171. {
  172. status delete_flag_array[MAX_NODE_NUMBER];
  173. int i,num_min,num_max,j;
  174. FILE * fp;
  175. int minus_pos,id;
  176. char prefix[20];
  177. for(i = 0;i<MAX_NODE_NUMBER;i++)
  178. delete_flag_array[i] = false;
  179. for(i = 4;i<argc;i++)
  180. {
  181. get_range(argv[i],&num_min,&num_max);
  182. for(j=num_min;j<=num_max;j++)
  183. delete_flag_array[j] = true;
  184. }
  185. fp = fopen(argv[2],"r");
  186. if(NULL == fp)
  187. {
  188. printf("opening file %s error.\n",argv[2]);
  189. return false;
  190. }
  191. while(!feof(fp))
  192. {
  193. fscanf(fp,"%s",machine_names[names_number++]);
  194. if(strcmp("",machine_names[names_number])!=0)
  195. names_number++;
  196. }
  197. fclose(fp);
  198. fp = fopen(argv[2],"w");
  199. if(NULL == fp)
  200. {
  201. printf("recreating file %s error.\n",argv[2]);
  202. return false;
  203. }
  204. if(0 == names_number)
  205. return false;
  206. minus_pos = find_minus(machine_names[0]);
  207. if(-1 == minus_pos)
  208. return false;
  209. for(i=0;i<names_number;i++)
  210. {
  211. id = atoi(machine_names[i]+minus_pos+1);
  212. if(0 == id)
  213. continue;
  214. if(true != delete_flag_array[id])
  215. {
  216. fprintf(fp,"%s\n",machine_names[i]);
  217. }
  218. }
  219. fclose(fp);
  220. return true;
  221. }
  222. status modify_list(int argc,char *argv[])
  223. {
  224. int id_map[MAX_NODE_NUMBER],i=0;
  225. FILE *fp;
  226. int minus_pos,id;
  227. char prefix[20];
  228. for(i=0;i<MAX_NODE_NUMBER;i++)
  229. {
  230. id_map[i] = -1;
  231. }
  232. i=4;
  233. while(i<argc)
  234. {
  235. id_map[atoi(argv[i])] = atoi(argv[i+1]);
  236. i+=2;
  237. }
  238. fp = fopen(argv[2],"r");
  239. if(NULL == fp)
  240. {
  241. printf("opening file %s error.\n",argv[2]);
  242. return false;
  243. }
  244. while(!feof(fp))
  245. {
  246. fscanf(fp,"%s",machine_names[names_number]);
  247. if(strcmp("",machine_names[names_number])!=0)
  248. names_number++;
  249. }
  250. fclose(fp);
  251. fp = fopen(argv[2],"w");
  252. if(NULL == fp)
  253. {
  254. printf("recreating file %s error.\n",argv[2]);
  255. return false;
  256. }
  257. if(0 == names_number)
  258. return false;
  259. minus_pos = find_minus(machine_names[0]);
  260. if(-1 == minus_pos)
  261. return false;
  262. strncpy(prefix,machine_names[0],minus_pos+1);
  263. for(i=0;i<names_number;i++)
  264. {
  265. id = atoi(machine_names[i]+minus_pos+1);
  266. if(0 == id)
  267. continue;
  268. if(-1 != id_map[id])
  269. {
  270. fprintf(fp,"%s%03d\n",prefix,id_map[id]);
  271. }
  272. else
  273. {
  274. fprintf(fp,"%s\n",machine_names[i]);
  275. }
  276. }
  277. fclose(fp);
  278. return true;
  279. }
  280. int main(int argc,char *argv[])
  281. {
  282. com_type type;
  283. status res;
  284. type = analyze_command(argc,argv);
  285. switch(type)
  286. {
  287. case create:
  288. res = create_list(argc,argv);
  289. if(false == res)
  290. {
  291. printf("creating list error.\n");
  292. exit(EXIT_FAILURE);
  293. }
  294. break;
  295. case delete:
  296. res = delete_list(argc,argv);
  297. if(false == res)
  298. {
  299. printf("deleting list error.\n");
  300. exit(EXIT_FAILURE);
  301. }
  302. break;
  303. case modify:
  304. res = modify_list(argc,argv);
  305. if(false == res)
  306. {
  307. printf("modifying list error.\n");
  308. exit(EXIT_FAILURE);
  309. }
  310. break;
  311. default:
  312. printf("Panic:type error.\n");
  313. exit(BAD_FORMAT);
  314. }
  315. return EXIT_SUCCESS;
  316. }
本文转自hipercomer 51CTO博客,原文链接:http://blog.51cto.com/hipercomer/891061

集群节点列表编辑程序相关推荐

  1. Docker创建Docker Swarm集群节点

    预置条件 一.配置防火墙 CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: systemctl stop firewalld.s ...

  2. 读懂这一篇,集群节点不下线

    作者 | 声东  阿里云售后技术专家 导读:排查完全陌生的问题.完全不熟悉的系统组件,是售后工程师的一大工作乐趣,当然也是挑战.今天借这篇文章,跟大家分析一例这样的问题.排查过程中,需要理解一些自己完 ...

  3. Kubernetes从懵圈到熟练:读懂这一篇,集群节点不下线

    排查完全陌生的问题,完全不熟悉的系统组件,是售后工程师的一大工作乐趣,当然也是挑战.今天借这篇文章,跟大家分析一例这样的问题.排查过程中,需要理解一些自己完全陌生的组件,比如systemd和dbus. ...

  4. Promethus搭建 K8S 集群节点资源监控系统

    对于集群的监控一般我们需要考虑以下几个方面: Kubernetes 节点的监控:比如节点的 cpu.load.disk.memory 等指标 内部系统组件的状态:比如 kube-scheduler.k ...

  5. db2 数据库配置HADR+TSA添加集群节点

    Db2配置HADR高可用+TSA添加集群节点 一.服务器资源 Master IP:10.78.10.1 数据库:dbclass Slave IP:10.78.10.2 数据库:dbclass VIP: ...

  6. rabbitmq基础5——集群节点类型、集群基础运维,集群管理命令,API接口工具

    文章目录 一.集群节点类型 1.1 内存节点 1.2 磁盘节点 二.集群基础运维 2.1 剔除单个节点 2.1.1 集群正常踢出正常节点 2.1.2 服务器异常宕机踢出节点 2.1.3 集群正常重置并 ...

  7. 集群节点Elasticsearch升级

    集群节点Elasticsearch升级 操作流程 1.首先执行Elasticsearch-1.2.2集群的索引数据备份 2.关闭elasticsearch-1.2.2集群的recovery.compr ...

  8. MySQL集群节点宕机,数据库脑裂!如何排障?

    作者介绍 王晶,中国移动DBA,负责"移动云"业务系统的数据库集成架构设计.运维.优化等工作:擅长技术领域MySQL,获Oracle颁发的"MySQL DBA" ...

  9. 怎样一步一步删除(linux amp; UNIX)环境下 oracle 11g 集群节点

     Deleting a Cluster Node on Linux and UNIX Systems 1.确定要删除的节点,是否active,pinned $ olsnodes -s -t 假设 ...

最新文章

  1. 青藏高原地下巨型空间形成原因
  2. node与mysql开源_node与mysql的相互使用————node+mysql
  3. 千亿市场竟是蓝海——在线音乐教学产品观察
  4. 开发技巧-使用SQL与Navicat快速导出一个自定义的MYSQL数据库字段表格(数据字典)为Word或Excel
  5. 学习:ups电池放电时间是怎么计算的?
  6. C++开发秋招笔试题
  7. Navicat工具导出Mysql数据表结构到Excel文件中
  8. pgsql 前10条_未来3年,广州83条城中村、285个旧街区将迎来改造
  9. 【华为云技术分享】云小课 | 初识HiLens Kit,解锁更多智慧应用场景
  10. function adapter bind(C++11)
  11. Hive 复制分区表和数据
  12. 最bt的搜索引擎插件!
  13. c lua mysql 扩展_lua安装及luarocks安装mysql扩展
  14. 原生滑动选择器 html,自已开发完美的触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器 - j.king...
  15. Django v3.1 官方中文文档(免费)
  16. vscode超好玩好用的插件
  17. Credit card dataset: SVM Classification --- PCA效果/不平衡数据
  18. prisma2.0和nexus搭建graphql后端(2)—nexus
  19. Android 检索相册视频文件
  20. Lambda表达式和方法引用综合案例(获取年龄最大的两个用户的 姓)

热门文章

  1. JQuery的ajaxFileUpload的使用
  2. jsjq面试笔记(下)
  3. 4、Firefox 中安装Fiddler插件
  4. 第三:Pycharm中安装Python依赖包(非常详细)
  5. ubuntu下常用的抓包软件_macOS下最常用也最好用的几款解压缩软件,你值得拥有...
  6. centos6安装python_如何在CentOS6上安装Python2.7和Python3.3
  7. html提值到php 冒泡,如何实现Html事件冒泡
  8. Spring Cloud Eureka 最简入门示例
  9. Git-本地库与中央库
  10. Spring Data Jpa中的save和saveAndFlush方法