以下脚本显示了如何使用后台任务执行此操作。第一部分在 10 秒限制后终止了一个 60 秒的进程。第二次尝试杀死已经退出的进程。请记住,如果您将超时设置得非常高,则进程 ID 可能会翻转并且您会终止错误的进程,但这更多是理论上的问题 - 超时必须非常很大,您将不得不开始很多个进程。
#!/usr/bin/bash
sleep 60 &
pid=$!
sleep 10
kill -9 $pid
sleep 3 &
pid=$!
sleep 10
kill -9 $pid
这是我的 Cygwin 机器上的输出:
$ ./limit10
./limit10: line 9: 4492 Killed sleep 60
./limit10: line 11: kill: (4560) - No such process
如果您只想等到该过程完成,您需要进入一个循环并检查。由于sleep 1 和其他命令实际上将花费超过一秒(但不会更多),因此这稍微不太准确。使用此脚本替换上面的第二部分(“echo $proc”和“date”命令用于调试,我不希望在最终解决方案中包含它们)。
#!/usr/bin/bash
date
sleep 3 &
pid=$!
((lim = 10))
while [[ $lim -gt 0 ]] ; do
sleep 1
proc=$(ps -ef | awk -v pid=$pid '$2==pid{print}{}')
echo $proc
((lim = lim - 1))
if [[ -z "$proc" ]] ; then
((lim = -9))
fi
done
date
if [[ $lim -gt -9 ]] ; then
kill -9 $pid
fi
date
它基本上是循环的,每秒检查进程是否仍在运行。如果不是,它会以特殊值退出循环,以不尝试杀死孩子。否则它会超时并杀死孩子。
这是sleep 3 的输出:
Mon Feb 9 11:10:37 WADT 2009
pax 4268 2476 con 11:10:37 /usr/bin/sleep
pax 4268 2476 con 11:10:37 /usr/bin/sleep
Mon Feb 9 11:10:41 WADT 2009
Mon Feb 9 11:10:41 WADT 2009
还有一个sleep 60:
Mon Feb 9 11:11:51 WADT 2009
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
Mon Feb 9 11:12:03 WADT 2009
Mon Feb 9 11:12:03 WADT 2009
./limit10: line 20: 4176 Killed sleep 60