我想在一定的时间后自动杀死命令。我想到一个这样的界面:
% constrain 300 ./foo args
这将运行“./foo”与“args”,但自动杀死它,如果它仍然在5分钟后运行。
将概念推广到其他约束可能是有用的,例如,如果它使用太多内存则自动杀死进程。
有没有任何现有的工具,或有任何人写这样的事情?
ADDED:Jonathan的解决方案正是我的想法,它的工作原理像linux上的魅力,但我不能让它工作在Mac OSX。我摆脱了SIGRTMIN,它让它编译正常,但信号只是不被发送到子进程。任何人知道如何使这项工作在Mac?
[添加:请注意,更新是可用的从乔纳森工作在Mac和其他地方。]
我已经到了晚了这个晚会,但我没有看到我最喜欢的技巧列在答案。
在* NIX下,警报(2)在execve(2)上继承,并且SIGALRM在默认情况下是致命的。所以,你可以经常简单:
$ doalarm () { perl -e 'alarm shift; exec @ARGV' "$@"; } # define a helper function $ doalarm 300 ./foo.sh args
或者安装一个trivial C wrapper为你做。
优点只涉及一个PID,机制简单。例如,如果./foo.sh退出“太快”并重新使用其PID,则不会杀死错误的进程。你不需要几个shell子进程一起工作,这可以正确完成,但相当容易发生。
缺点时间有限的过程不能操纵其闹钟(例如,alarm(2),ualarm(2),setitimer(2)),因为这将很可能清除继承的警报。显然,它也不能阻止或忽略SIGALRM,尽管对于一些其他方法可以说SIGINT,SIGTERM等。
一些(非常老的,我认为)系统在报警(2)方面实现睡眠(2),并且,即使在今天,一些程序员使用报警(2)作为用于I / O和其他操作的粗略的内部超时机制。然而,在我的经验,这种技术适用于绝大多数你想限时的过程。