2017-04-21 32 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); 
} 
相關問題