我有一个名为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,这里有点不同,因为意图是中止整个脚本,而不仅仅是单个命令。授予,不*非常*不同。 –