Баш - Как я должен бездействовать, пока не получу сигнал? - PullRequest
9 голосов
/ 01 декабря 2011

У меня есть скрипт для запуска launchd, который запускает сервер, а затем говорит ему, чтобы он корректно завершил работу, когда launchd убил его (что должно быть при завершении работы).Мой вопрос: каков подходящий идиоматичный способ заставить скрипт бездействовать, пока он не получит сигнал?Должен ли я просто использовать цикл while-true-sleep-1, или есть лучший способ сделать это?

#!/bin/bash

cd "`dirname "$0"`"

trap "./serverctl stop" TERM
./serverctl start

# wait to receive TERM signal.

Ответы [ 3 ]

4 голосов
/ 24 августа 2016

Вы можете просто использовать «бесконечность сна». Если вы хотите выполнить больше действий при завершении работы и не хотите создавать для этого функцию, альтернативой может быть:

#!/bin/bash
sleep infinity & PID=$!
trap "kill $PID" INT TERM

echo starting
# commands to start your services go here

wait

# commands to shutdown your services go here
echo exited

Другой альтернативой «бесконечности сна» (кажется, что busybox не поддерживает ее) может быть, например, tail -fn0 $ 0.

3 голосов
/ 06 декабря 2011

Обычный wait будет значительно менее ресурсоемким, чем спин-блокировка, даже если в нем будет сон.

2 голосов
/ 01 декабря 2011

Почему вы хотите, чтобы ваш скрипт работал? Есть ли причина? Если вы не сделаете ничего позже после сигнала, я не вижу причины для этого.

Когда вы получаете TERM после завершения работы, ваш serverctl и исполняемый файл сервера (если есть) также получают TERM одновременно.

Чтобы сделать это по своему замыслу, вы должны установить скрипт serverctl как скрипт rc и позволить init (start и) остановить его. Здесь Я описал, как настроить серверный процесс, изначально не предназначенный для работы в качестве сервера.

...