2017-04-21 78 views
1

我有一个名为A的应用程序,它接收输入n并在返回答案前运行一段时间。如果任何命令运行时间过长,则终止脚本

我想用以下简单的bash脚本增加n尺寸执行A

#!/bin/sh 

time ./A 10 
time ./A 20 
time ./A 30 
. 
. 
. 

不过,我需要的东西很重要。如果time调用执行时间过长,因为输入很大,那么我需要整个bash脚本停止运行。

有没有简单的方法来做到这一点?

+2

我已经编辑就这么在这里做,但在未来,请尽量让你的问题标题具体到个人的问题,这样其他人就可以 - 从寻找一个标题 - 判断一个先前存在的问题及其答案将帮助他们解决问题。 –

+1

[命令行命令在一段时间后自动杀死一个命令]的可能重复(http://stackoverflow.com/questions/601543/command-line-command-to-auto-kill-a-command-一定量的时间) – Evert

+1

@Evert,这里有点不同,因为意图是中止整个脚本,而不仅仅是单个命令。授予,不*非常*不同。 –

回答

1

的以下可以工作:

#! /bin/bash                     

timeout 2 time sleep 1                   
if [[ $? == 124 ]]                    
then                       
    exit;                      
fi                        

timeout 2 time sleep 3                   
if [[ $? == 124 ]]                    
then                       
    exit;                      
fi                        

timeout 2 time sleep 5                   
if [[ $? == 124 ]]                    
then                       
    exit;                      
fi                        

在我的系统中,产生:

0.00user 0.00system 0:01.00elapsed 0%CPU (0avgtext+0avgdata 1696maxresident)k 
0inputs+0outputs (0major+73minor)pagefaults 0swaps 

不是最漂亮的输出,但在第一行之后停止:定时sleep 3的结果和sleep 5从未示出。

请注意,timeout是一个GNU coreutils命令,并且没有安装在任何地方(如果它可以安装在您的系统上)。退出状态也可能不同:124是默认值,但最好测试$? != 0

+2

你的意思是'$?'和'$ 0',不是吗? –

+0

@CharlesDuffy哎呀;固定 – Evert

1

一种方法是同时启动sleep和您的进程在后台,看看谁先完成。

注意以下假定没有其他的后台进程已经启动下面的代码在眼前:

timeout=30 # set this to the number of seconds you want 

timed_run() { 
    time "[email protected]" 
} 

# use: abort_on_timeout timeout_in_seconds command_here 
abort_on_timeout() { 
    local sleep_pid cmd_pid retval 
    local seconds=$1; shift 
    wait # reap any preexisting background processes so they don't interfere 
    sleep "$seconds" & sleep_pid=$! 
    "[email protected]" & cmd_pid=$! 
    wait; retval=$? 
    if kill -0 "$sleep_pid"; then 
    # cmd finished before sleep 
    kill "$sleep_pid" 
    return "$retval" 
    fi 
    # sleep finished before cmd, so exit the whole script 
    kill "$cmd" 
    exit 1 
} 

abort_on_timeout "$timeout" ./A 10 
abort_on_timeout "$timeout" ./A 20 
abort_on_timeout "$timeout" ./A 30 

当然,你可以使用一个循环:

v=10 
while :; do 
    abort_on_timeout "$timeout" ./A "$v" 
    v=$((v + 10)) 
done 
0
const char *env[] = {NULL}; 
const char *argv[] = {NULL}; 
const char *script = "my_script.sh"; 
const int time_interval = 10; 

/* ... */ 

pid_t parent = getpid(); 
pid_t child = vfork(); 
if (child == -1) { 
    printf("Pity! Cannot do vfork\n"); 
} 
else if (child == 0) { 
    execve(script, argv, env); 
} 
else { 
    sleep(time_interval); 
    kill(9, child); 
} 
相关问题