Один из способов сделать это - с помощью сигналов и ловушек.Вот простой пример:
#!/bin/bash
me=$$
# Start a background process to signal us when the time has passed
(
sleep 10
kill -USR1 $me
) &
# When we recieve SIGUSR1, commit suicide
trap "kill $me" SIGUSR1
# Do stuff until we commit suicide
while [ 1 -eq 1 ]
do
echo 'Hello!'
sleep 1
done
Комментарии не требуют пояснений (я надеюсь).Первая часть запускает фоновый процесс, который просто спит в течение некоторого периода времени (в данном примере 10 секунд), а затем, когда он просыпается, отправляет SIGUSR1 исходному процессу.
Shellscript перехватывает это (с помощью trap
) и просто выдает kill
для своего собственного PID, останавливая процесс.
В остальном это просто бесконечный цикл - это trap
, который убивает скрипт и завершает цикл.
Технически вам не нужна ловушка в приведенном выше примере: фоновый процесс может просто выдать kill $me
напрямую, но я включил его для полноты, так как вы можете использовать его как ловушку для других вещей(например, если вы не хотите умирать, а устанавливаете флаг и хотите, чтобы цикл завершился естественным образом, или вам нужно выполнить очистку перед завершением).