大家有時候執行一個指令碼,因為指令碼中有些程式的假死和逾時,影響了我們對下一步的判斷。隨意我們有必要設定對函數和進程的逾時設定,讓他在一段時間沒有反應後,return一個狀態。
在命令參數裡ssh -o ServerAliveInterval=60 這樣子就能控制到60秒。
比如ClientAliveInterval=15,ClientAliveCountMax=3,那就會在15秒發送一次,30秒發送一次,45秒發送一次,如果三次都失敗,收回這個連結
但是這個參數不是太好用,大家可以後面加個 sleep 100 試試。
- #!/bin/sh
-
- timeout()
- {
- waitfor=3
- command=$*
- $command &
- commandpid=$!
-
- ( sleep $waitfor ; kill -9 $commandpid > /dev/null 2>&1 ) &
-
- watchdog=$!
- sleeppid=$PPID
- wait $commandpid > /dev/null 2>&1
-
- kill $sleeppid > /dev/null 2>&1
- }
-
- test123()
- {
-
- ifconfig
- sleep 10
- ifconfig
- # curl htpp://www.facebook.com
- }
-
- timeout test123
650) this.width=650;" border="0" alt="" src="http://www.bkjia.com/uploads/allimg/131227/1T52a427-0.jpg" />
基本控制到 3s 左右
還有一個perl版本的
- #! /usr/bin/env perl
- use POSIX qw(strftime WNOHANG);
-
- #check input
- my $timeout = shift @ARGV;
- my ($secs) = $timeout =~ /--timeout=(\d+)$/;
- unless($secs)
- {
- print "Usage: ./timeout --timeout=[SECONDS] [COMMAND] \n";
- exit -1;
- }
-
- #fork and exec
- my $status = 0;
- $SIG{CHLD} = sub { while(waitpid(-1,WNOHANG)>0){ $status = -1 unless $? == 0; exit $status;} };
- $0 = 'timeout hacked ' . $ARGV[0];
- defined (my $child = fork);
- if($child == 0)
- {
- my $cmd = join ' ', @ARGV;
- exec($cmd);
- }
- $SIG{TERM} = sub { kill TERM => $child };
- $SIG{INT} = sub { kill INT => $child };
-
-
- #kill when timeout
- sleep $secs;
- $status = -1;
- kill TERM => $child;
- sleep 1 and kill INT => $child if kill 0 => $child;
- sleep 1 and kill KILL => $child if kill 0 => $child;
- exit $status;
- #用法 ./t --timeout=3 curl http://www.facebook.com
上面是perl 其實用的方法是一樣的~
本文出自 “峰雲,就她了。” 部落格,請務必保留此出處http://rfyiamcool.blog.51cto.com/1030776/1189520