解決指令碼中的逾時問題【shell,perl,ssh】

來源:互聯網
上載者:User

大家有時候執行一個指令碼,因為指令碼中有些程式的假死和逾時,影響了我們對下一步的判斷。隨意我們有必要設定對函數和進程的逾時設定,讓他在一段時間沒有反應後,return一個狀態。

 

在命令參數裡ssh -o ServerAliveInterval=60  這樣子就能控制到60秒。

比如ClientAliveInterval=15,ClientAliveCountMax=3,那就會在15秒發送一次,30秒發送一次,45秒發送一次,如果三次都失敗,收回這個連結

但是這個參數不是太好用,大家可以後面加個 sleep 100 試試。

 

 
  1. #!/bin/sh 
  2.   
  3. timeout() 
  4.         waitfor=3 
  5.         command=$* 
  6.         $command & 
  7.         commandpid=$! 
  8.   
  9.         ( sleep $waitfor ; kill -9 $commandpid > /dev/null 2>&1 ) & 
  10.   
  11.         watchdog=$! 
  12.         sleeppid=$PPID 
  13.         wait $commandpid > /dev/null 2>&1  
  14.   
  15.         kill $sleeppid > /dev/null 2>&1 
  16.   
  17. test123() 
  18.  
  19.         ifconfig 
  20.         sleep 10 
  21.         ifconfig 
  22. #        curl htpp://www.facebook.com 
  23.   
  24. timeout test123 

 

650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131227/1T52a427-0.jpg" />

 

基本控制到 3s 左右

還有一個perl版本的

 
  1. #! /usr/bin/env perl 
  2. use POSIX qw(strftime WNOHANG); 
  3.  
  4. #check input 
  5. my $timeout = shift @ARGV; 
  6. my ($secs) = $timeout =~ /--timeout=(\d+)$/; 
  7. unless($secs) 
  8.     print "Usage: ./timeout --timeout=[SECONDS] [COMMAND] \n"; 
  9.     exit -1; 
  10.  
  11. #fork and exec 
  12. my $status = 0; 
  13. $SIG{CHLD} = sub { while(waitpid(-1,WNOHANG)>0){ $status = -1 unless $? == 0; exit $status;} }; 
  14. $0 = 'timeout hacked ' . $ARGV[0]; 
  15. defined (my $child = fork); 
  16. if($child == 0) 
  17.     my $cmd = join ' ', @ARGV; 
  18.     exec($cmd); 
  19. $SIG{TERM} = sub { kill TERM => $child }; 
  20. $SIG{INT} = sub { kill INT => $child }; 
  21.  
  22.  
  23. #kill when timeout 
  24. sleep $secs; 
  25. $status = -1; 
  26. kill TERM => $child; 
  27. sleep 1 and kill INT => $child if kill 0 => $child; 
  28. sleep 1 and kill KILL => $child if kill 0 => $child; 
  29. exit $status; 
  30. #用法  ./t --timeout=3 curl http://www.facebook.com 

上面是perl   其實用的方法是一樣的~   

 

本文出自 “峰雲,就她了。” 部落格,請務必保留此出處http://rfyiamcool.blog.51cto.com/1030776/1189520

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.