我有一個名爲A
的應用程序,它接收輸入n
並在返回答案前運行一段時間。如果任何命令運行時間過長,則終止腳本
我想用以下簡單的bash腳本增加n
尺寸執行A
:
#!/bin/sh
time ./A 10
time ./A 20
time ./A 30
.
.
.
不過,我需要的東西很重要。如果time
調用執行時間過長,因爲輸入很大,那麼我需要整個bash腳本停止運行。
有沒有簡單的方法來做到這一點?
我有一個名爲A
的應用程序,它接收輸入n
並在返回答案前運行一段時間。如果任何命令運行時間過長,則終止腳本
我想用以下簡單的bash腳本增加n
尺寸執行A
:
#!/bin/sh
time ./A 10
time ./A 20
time ./A 30
.
.
.
不過,我需要的東西很重要。如果time
調用執行時間過長,因爲輸入很大,那麼我需要整個bash腳本停止運行。
有沒有簡單的方法來做到這一點?
的以下可以工作:
#! /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
。
你的意思是'$?'和'$ 0',不是嗎? –
@CharlesDuffy哎呀;固定 – Evert
一種方法是同時啓動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
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);
}
我已經編輯就這麼在這裏做,但在未來,請儘量讓你的問題標題具體到個人的問題,這樣其他人就可以 - 從尋找一個標題 - 判斷一個先前存在的問題及其答案將幫助他們解決問題。 –
[命令行命令在一段時間後自動殺死一個命令]的可能重複(http://stackoverflow.com/questions/601543/command-line-command-to-auto-kill-a-command-一定量的時間) – Evert
@Evert,這裏有點不同,因爲意圖是中止整個腳本,而不僅僅是單個命令。授予,不*非常*不同。 –