免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: danielsong
打印 上一主题 下一主题

请问:如何让一个程序运行指定时间后退出 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-07-31 04:00 |只看该作者
原帖由 ailms 于 2007-7-31 01:52 发表
??

有那位高人知道为什么 ulimit -t 20 对 vi 不起作用吗?

好象ulimit限制的是“一片”cpu时间,vi这种交互程序很难让cpu为它转20秒,1秒都很难。如果你用1秒,再从vi里转一个耗时的
find /

那么你会看到到时中断。

论坛徽章:
0
12 [报告]
发表于 2007-07-31 08:04 |只看该作者
以下是我的构想.未经调试.(因为在网吧上网)
我是新手,所以错误在所难免,请仔细调试后使用!

//argv[0]:run
//argv[1]:number of senconds you want arg[2] to run
//argv+2:the command and it's arguments you want to run
int main(int argc,char*argv[])
{
  if((pid=fork())<0){
    exit(-1);
  }
  else if(pid==0){//child
    execvp(argv[2],argv+2);
    perror("wrong exec:");
  }
  else if(pid>0){//parent
    signal(SIGALRM,terminate_child_and_exit(pid));//TODO:you need to define this function
    alarm(atoi(argv[1]));
    pause();
  }
}

论坛徽章:
0
13 [报告]
发表于 2007-07-31 12:15 |只看该作者
回到LZ原来的问题上来吧。LZ的限时有两种,一是挂钟时间,二是CPU时间。无论那种,都不应当是从程序内部来控制,而应当从外部来实现。我谈一点思路。
挂钟时间比较简单,几行脚本就可以,先把涉及的程序放在后台运行,再sleep 固定时间,然后中断后台进程就可以了吧?
CPU时间要麻烦一些,但我想/proc里应该有进程的CPU时间,监控脚本查询/proc里的CPU时间,到时中断进程应该可以。要注意的两个细节是轮询/proc的频度以及进程提前结束的处理。

如果系统配有第三方调度程序或资源管理系统,那么很多这样的软件在进程时间管理上有比LZ想要的更多的功能。

论坛徽章:
0
14 [报告]
发表于 2007-07-31 13:07 |只看该作者
我谈一点思路。
挂钟时间比较简单,几行脚本就可以,先把涉及的程序放在后台运行,再sleep 固定时间,然后中断后台进程就可以了吧?


那用我的第一个脚本不久解决了嘛

但貌似 lz 不是这种意思,是想让程序自己退出的。

论坛徽章:
0
15 [报告]
发表于 2007-07-31 14:55 |只看该作者
那用我的第一个脚本不久解决了嘛

但貌似 lz 不是这种意思,是想让程序自己退出的。

一个定时N秒的脚本来kill掉另一个总可以了吧。
#/bin/sh
xxxx.sh
sleep(N)
grep pid of xxxx.sh
kill - 9 pid
不就行了吗?
关注cpu时钟的解决方案。

论坛徽章:
0
16 [报告]
发表于 2007-07-31 15:08 |只看该作者
ls 的方案是不对的 。

如果刚好 sleep 10 秒后,而 xxx.sh 也同时启动,那不就把 xxx.sh 进程 kill 掉了吗

这时还没有运行够100秒,所以应该用 ps -o start_time 来判断,再做进一步的动作

论坛徽章:
0
17 [报告]
发表于 2007-07-31 15:12 |只看该作者
这个各人自己判断吧,可能ls的更精确,可我的实现更简单,可行。
ls的给个脚本看看,谢谢。要学习。
还有就是cpu的怎么干?

论坛徽章:
0
18 [报告]
发表于 2007-07-31 15:14 |只看该作者
to ls :

下面的脚本我已经测试过了,是可行的。


  1. [n7css@monitor n7css]$ cat hard_limit.sh  |grep -v '^$'
  2. #!/bin/bash
  3. while true ; do
  4. pid=$(pgrep -u n7css vi)
  5. for i in $pid ;do
  6.         start_time=$(ps -o start_time $i  |tail -n 1 |xargs -i date -d {} +%s)
  7.         cur_time=$(date +%s)
  8.         if [ $(( cur_time - start_time )) -ge 100 ] ;then
  9.                 echo "found [vi] process  [ $i ] started at " $(date -d "1970-01-01 $start_time sec utc") ",kill it"
  10.                 /bin/kill $i
  11.                 sleep 5
  12.                 if ps $i >/dev/null ;then
  13.                         /bin/kill -9 $i
  14.                 fi

  15.         fi
  16. done
  17. done
  18. [n7css@monitor n7css]$
复制代码

论坛徽章:
0
19 [报告]
发表于 2007-07-31 15:19 |只看该作者
我不会写脚本啊。

论坛徽章:
0
20 [报告]
发表于 2007-07-31 15:19 |只看该作者
上面的脚本只是以 vi 进程为例,如果需要请修改脚本
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP