Perl自动释放Licence启动Verdi

在工作中,遇到verdi的License不够的情况,某些人占用了多个License,为及时获得一个可用的License,写了一个perl来kill运行时间最长的进程。

主要功能


  • 在perl中,通过(lmstat -a)或者(ps -ef)得到verdi运行情况
  • 得到verdi分配情况
  • 得到verdi占用最多的用户的使用信息
  • 活动该用户使用最长的verdi进程号

具体执行情况

方法一:推荐


方法二:


Perl代码

方法一:推荐


  1. #!/usr/bin/perl
  2. #----------------------------------------------------------------------
  3. #
  4. # Filename: start_verdi
  5. # Description: file function description
  6. #
  7. # Author: 乔木
  8. # Version: 1.0.0
  9. # Create: 2017-12-05 21:29:05
  10. # Last Modified: 2017-12-05 21:29:05
  11. # History: Modify the history
  12. #----------------------------------------------------------------------
  13. #####################################################
  14. # start_verdi
  15. #####################################################
  16. use warnings;
  17. #####################################################
  18. my (@license_stat,$license_flag,@users_license,@users_name,%verdi_user,$mostverdi_user,$total_lic,$use_lic);
  19. @license_stat = `lmstat -f Verdi`;
  20. #####################################################
  21. # get license info
  22. #####################################################
  23. $license_flag = 0;
  24. foreach my $line (@license_stat){
  25. chomp($line);
  26. next if($line =~ /^\s*$/);
  27. if($line =~ /Users of Verdi/){
  28. $line =~ /Total of (\d+) licenses issued; Total of (\d+) licenses in use/;
  29. $total_lic = $1;
  30. $use_lic = $2;
  31. #print("total_lic = $total_lic, use_lic = $use_lic\n");
  32. if($use_lic < $total_lic){
  33. system("verdi @ARGV");
  34. exit;
  35. }
  36. next;
  37. }
  38. if($line =~ /^-----------/){
  39. $license_flag = 0;
  40. #print("$line\n");
  41. last;
  42. }
  43. if($license_flag){
  44. push(@users_license, $line);
  45. }
  46. if($line =~ /"Verdi"/){
  47. $license_flag = 1;
  48. #print("$line\n");
  49. }
  50. }
  51. #####################################################
  52. # handle info
  53. #####################################################
  54. shift(@users_license); #delect first line
  55. foreach my $line (@users_license){
  56. chomp($line);
  57. #print("$line\n");
  58. push(@users_name,(split /\s+/, $line)[1]);
  59. }
  60. #print("users_name = @users_name\n");
  61. #####################################################
  62. # creat user hash >> verdi number
  63. #####################################################
  64. foreach my $user (@users_name){
  65. $verdi_user{$user} += 1;
  66. }
  67. my $user_num= keys %verdi_user;
  68. my $i=0;
  69. foreach (sort {$verdi_user{$a} <=> $verdi_user{$b}} keys %verdi_user) {
  70. $i++;
  71. #printf("%-15s %d verdi\n",$_,$verdi_user{$_} );
  72. if($i == $user_num){
  73. $mostverdi_user = $_;
  74. print("\n$_ has the most verdi: $verdi_user{$_}\n\n");
  75. }
  76. }
  77. #####################################################
  78. # get process info
  79. #####################################################
  80. foreach my $line (@users_license){
  81. chomp($line);
  82. #print("$line\n");
  83. my $user_name = (split /\s+/, $line)[1];
  84. if($user_name eq $mostverdi_user){
  85. #print("$line\n");
  86. $line =~ /\((mm\d.*)\)/;
  87. my $user_process = $1;
  88. #print("$user_process\n");
  89. $user_process =~ s/\// /;
  90. #print("lmremove -h Verdi $user_process\n");
  91. system("lmremove -h Verdi $user_process");
  92. system("verdi @ARGV");
  93. last;
  94. }
  95. }
  96. exit;

方法二:


  1. #!/usr/bin/perl
  2. #----------------------------------------------------------------------
  3. #
  4. # Filename: reqverdi
  5. # Description: file function description
  6. #
  7. # Author:
  8. # Version: 1.0.0
  9. # Create: 2017-12-01 07:23:56
  10. # Last Modified: 2017-12-01 07:23:56
  11. # History: Modify the history
  12. #----------------------------------------------------------------------
  13. #####################################################
  14. # reqverdi
  15. #####################################################
  16. use warnings;
  17. my (%verdi_user,$mostverdi_user,%prosess_hash,$longest_prosess);
  18. #####################################################
  19. # 获得verdi进程信息
  20. #####################################################
  21. my @user_info = `ps -ef | grep Novas | grep -v "grep" | awk '{print \$1}'`;
  22. for(my $i=0;$i < @user_info;$i++){
  23. chomp($user_info[$i]);
  24. #print("$user_info[$i]\n");
  25. }
  26. #####################################################
  27. # creat user hash >> verdi number verdi分配情况
  28. #####################################################
  29. foreach my $user (@user_info){
  30. $verdi_user{$user} += 1;
  31. }
  32. my $user_num= keys %verdi_user;
  33. my $i=0;
  34. foreach (sort {$verdi_user{$a} <=> $verdi_user{$b}} keys %verdi_user) {
  35. $i++;
  36. printf("%-15s %d verdi\n",$_,$verdi_user{$_} );
  37. if($i == $user_num){
  38. $mostverdi_user = $_;
  39. print("\n$_ has the most verdi: $verdi_user{$_}\n\n");
  40. }
  41. }
  42. #####################################################
  43. # get $mostverdi_user info 获得占用最多verdi用户的verdi运行时间
  44. #####################################################
  45. my @most_info = `ps -ef | grep Novas| grep $mostverdi_user| grep -v "grep"`;
  46. #print "@most_info\n";
  47. print("user prosess timer\n");
  48. foreach my $process (@most_info){
  49. my @clump = split /\s+/,$process;
  50. printf("%-10s %-10s %s\n",$clump[0],$clump[1],$clump[6]);
  51. ############################
  52. # convert timer
  53. ############################
  54. my @day_timer = split /-/,$clump[6];
  55. my @timer = split /:/,$day_timer[-1];
  56. #print("@day_timer @timer\n");
  57. my $timer_convt = 0;
  58. if(@day_timer == 2){
  59. $timer_convt = $day_timer[0]*24*60+$timer[0]*60+$timer[1];
  60. #print("$timer_convt\n");
  61. }
  62. else{
  63. $timer_convt = $timer[0]*60+$timer[1];
  64. #print("$timer_convt\n");
  65. }
  66. $prosess_hash{$clump[1]} = $timer_convt;
  67. }
  68. #####################################################
  69. # get $mostverdi_user the longest run timer prosess number
  70. # 得到运行最长的进程号
  71. #####################################################
  72. my $prosess_num= keys %prosess_hash;
  73. $i=0;
  74. foreach (sort {$prosess_hash{$a} <=> $prosess_hash{$b}} keys %prosess_hash) {
  75. $i++;
  76. #printf("%-15s %s\n",$_,$prosess_hash{$_} );
  77. if($i == $prosess_num){
  78. $longest_prosess = $_;
  79. my $days = int($prosess_hash{$_}/(24*60));
  80. my $hours = int($prosess_hash{$_}%(24*60)/60);
  81. print("\n$_ has run $days day $hours hours\n\n");
  82. }
  83. }
  84. print("kill -9 $longest_prosess\n");
  85. system"kill -9 $longest_prosess";

Perl自动释放Licence启动Verdi的更多相关文章

  1. OC自动释放池autoreleasepool介绍

    自动释放池的机制是:它使得应用在创建新对象时,系统能够有效地管理应用所使用的内存. @autoreleasepool { statements } 在创建新对象时,并且系统未启动ARC特性,那么在使用 ...

  2. 63 (OC)* NSAutoreleasePool 自动释放池

    目录 0:ARC 1: 自动释放池 2:NSAutoreleasePool实现原理 3:autorelease 方法 4: Runloop和Autorelease的关系 5: Using Autore ...

  3. 刀哥多线程自动释放池autoreleasepool

    自动释放池 作用 自动释放对象的 所有 autorelease 的对象,在出了作用域之后,会被自动添加到最近创建的自动释放池中 自动释放池被销毁或者耗尽时,会向池中所有对象发送 release 消息, ...

  4. Delphi 中的自动释放策略-转

    八.使用结构体而不是结构体指针: 很重要 一.指定 Owner 后, 随 Owner 连带释放: //uses Vcl.StdCtrls, Vcl.ExtCtrls; var panel: TPane ...

  5. Autorelease自动释放池的使用

    Autorelease自动释放池的使用 使用ARC开发,只是在编译时,编译器会根据代码结构自动添加了retain.release和autorelease. MRC内存管理原则:谁申请,谁释放 遇到al ...

  6. iOS---NSAutoreleasePool自动释放原理及详解

    前言:当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池.它仍然是个正当的对象,因此自动释放池 定义的作用域内的其它对象可以向它发送消息.当程序 ...

  7. OC 内存泄露 自动释放池

    花絮:看到下面的代码就想起这么一个调侃: 一个老程序员,功成名就,金盆洗手不在写代码后,决定练练书法.提笔思索良久后在纸上写下:Hello world! /********************** ...

  8. autoreleasepool自动释放池

     示例: @autoreleasepool { ; i[largeNumber; i++) { (因识别问题,该行代码中尖括号改为方括号代替) Person *per = [[Person alloc ...

  9. paip.jdbc 连接自动释放的测试

    paip.jdbc 连接自动释放的测试 使用的mysql jdbc3.1.6  以及5.1.7 测试结果,在没有conn.close()的情况哈.. 作者Attilax  艾龙,  EMAIL:146 ...

随机推荐

  1. [AngularFire] Angular File Uploads to Firebase Storage with Angular control value accessor

    The upload class will be used in the service layer. Notice it has a constructor for file attribute, ...

  2. js中对数组的操作-------Day49

    今天碰到了一个问题:easyui的使用中,datagrid表格的高度怎样改变(设定成一个固定的高度),看了半天文档,也从网上查了些.还楞是没弄出来,有点小郁闷.这easyui在某些情况情况下确实好用了 ...

  3. 更为详细的Txtsetup.sif文件解释

    更为详细的Txtsetup.sif文件解释;代码页定义, 以免文本安装模式下无法正常显示简体中文 (以下基本都是跟简体中文相关的, 不同语言版本的 Windows, 此处定义也不同)[nls]Ansi ...

  4. resource-color 的引用

    1.在xml文件中引用 android:textColor="@color/tv_top_title_color" 2.在代码中引用 1)在color.xml中定义 <?xm ...

  5. Sql延时

    IF EXISTS(SELECT * FROM sys.procedures WHERE name='usp_wait30s')BEGIN DROP PROC usp_wait30sENDgocrea ...

  6. 洛谷——P1042 乒乓球

    https://www.luogu.org/problem/show?pid=1042 题目背景 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及.其中11分制改 ...

  7. 洛谷 P1679 神奇的四次方数

    P1679 神奇的四次方数 题目描述 在你的帮助下,v神终于帮同学找到了最合适的大学,接下来就要通知同学了.在班级里负责联络网的是dm同学,于是v神便找到了dm同学,可dm同学正在忙于研究一道有趣的数 ...

  8. Spring3拦截引发的问题——WEB开发中的client路径

    什么是client路径? 第一类.也就是html或js文件等client訪问的文件里的路径,这里包含一些资源文件的引入(js.css还有各种图片等),或是跳转到静态html页面,总之获取的都是静态资源 ...

  9. 82.管道实现cgi内存多线程查询

    总体思路就是客户端写入要查询的数据到管道中,服务器端从管道读取,然后写入随机文件,再把文件名写入管道,然后客户端再读取文件 服务器端 设置缓冲区大写,设置管道名字,以及标识有多少个线程等 //设置缓存 ...

  10. winform程序,备份数据库+并压缩+并删除以前的备份

    说明:为了定时备份服务器上的数据库并压缩到指定目录,方便下载到本地而写本程序.配合windows的任务计划,可以达到定时备份数据库的目的. 程序需引用SQLDMO.DLL,如电脑上已安装sqlserv ...