Следующий скрипт показывает, как сделать это с помощью фоновых задач. Первый раздел убивает 60-секундный процесс после 10-секундного ограничения. Вторая попытка убить процесс, который уже завершен. Имейте в виду, что если вы установите очень большое время ожидания, идентификаторы процесса могут перевернуться, и вы убьете неправильный процесс, но это скорее теоретическая проблема - время ожидания должно быть очень большим * и вам придется запускать лот процессов.
#!/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