Как я говорю сценарию ожидать процесса, чтобы начать принимать запросы на порте?

Я рекомендую использовать /usr/local для коммерческих программ Вы могли бы установить, такие как Mathematica. Поместите его в его собственный раздел, когда Вы настроите. При обновлении ОС этот раздел не будет нарушен, и Вы не должны будете переустанавливать его содержание. Так используйте его для материала, который Вы хотите сохранить между обновлениями операционной системы.

Отдельно, удостоверьтесь, что Вы даете /home его собственный раздел поэтому также.

33
09.01.2011, 19:44
4 ответа

Лучший тест, чтобы видеть, принимает ли сервер соединения, должен на самом деле попытаться соединиться. Используйте постоянный клиент для любого протокола, который говорит Ваш сервер, и не попробуйте никакую-op команду.

Если Вы хотите легкий TCP или клиент UDP, можно управлять просто от оболочки, использовать netcat. То, как программировать разговор, зависит от протокола; много протоколов имеют сервер близко соединение на определенном входе, и netcat затем выйдет.

while ! echo exit | nc localhost 13000; do sleep 10; done

Можно также сказать netcat выходить после установления соединения. Это возвращается 1, если нет никакого соединения и 0, если существует так, мы инвертируем его вывод. В зависимости от Вашей версии netcat это может поддерживать один или обе из следующих команд:

while ! nc -z localhost 13000 </dev/null; do sleep 10; done
while ! nc -q 1 localhost 13000 </dev/null; do sleep 10; done

Альтернативный подход должен ожидать серверного процесса для открытия сокета слушания.

while netstat -lnt | awk '$4 ~ /:13000$/ {exit 1}'; do sleep 10; done

Если бы Вы находитесь на Mac OS, netstat использует немного отличающийся выходной формат, таким образом, Вы хотели бы следующее вместо этого:

while netstat -lnt | awk '$4 ~ /\.13000$/ {exit 1}'; do sleep 10; done

Или Вы могли бы хотеть быть нацеленными на определенный идентификатор процесса:

while ! lsof -n -Fn -p $pid | grep -q '^n.*:13000$'; do sleep 10; done

Я не могу думать ни о каком способе реагировать на процесс, начинающий слушать сокет (который избежал бы подхода опроса) за исключением использования ptrace.

53
27.01.2020, 19:37
  • 1
    я думаю netcat, является ответом, так спасибо. Разъясниться, что я пытаюсь сделать, записать сценарий как часть процедуры выравнивания нагрузки. Я должен запустить процесс, ожидать его, чтобы принять запросы на порте и затем завершить работу оригинала. Если существуют лучшие способы сделать это, вместо того, чтобы писать мой собственный сценарий, я внимательно слушаю. –  Will 31.12.2010, 18:36
  • 2
    @Will: это - совсем другой вопрос! Я записал другой ответ. потрясающий –  Gilles 'SO- stop being evil' 31.12.2010, 19:37
  • 3
    мне нравится netcat решение также. У меня есть использование сценария nc -w 2 </dev/null >/dev/null — если соединение занимает больше чем 2 секунды, оно испытывает таймаут и сбои — который удобен для моего использования. –  ephemient 10.01.2011, 01:10
  • 4
    К вашему сведению я не могу добраться 'в то время как nc-q 1 localhost 13000 </dev/null; действительно спите 10; сделанный' один для работы. Это просто сразу возвращается. Первый хорошо работает все же.Спасибо! –  Ellis Percival 19.03.2015, 18:04
  • 5
    @Flyte nc -q 1 localhost 13000 </dev/null возвраты сразу, если никакой сервер не слушает, но это возвращается с кодом ошибки, таким образом, цикл заставляет его спать и попробовать еще раз несколько секунд спустя. –  Gilles 'SO- stop being evil' 19.03.2015, 19:16

Если у вас есть баш и кореутилы (например. таймаут, сон), но не nc/lsof/netstat, Вы можете использовать это решение, использующее bash magic tcp сокеты:

while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done
17
27.01.2020, 19:37

Следуя предыдущему примеру с bash магией tcp сокетов, вот улучшенная версия, которая ожидает соединения в течение ограниченного количества времени.

timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'

Разница в том, что если соединение не было доступно в течение 15с, - он не будет циклиться вечно, а выйдет с кодом ошибки.

Это полезно в скриптах init для ожидания готовности/доступности сервиса после запуска.

17
20.08.2021, 13:38

Я написал утилиту для ожидания открытия порта, она также может проверять доступность MySQL, PostgreSQL, Redis и т.д.

# Checking TCP port
wait4x tcp localhost:8080

# Checking TCP port with specific timeout (5 Minutes)
wait4x tcp localhost:8080 -t 5m

Это открытый исходный код, доступный по адресуhttps://github.com/atkrad/wait4x.Надеюсь, другим это будет полезно!

1
20.08.2021, 13:38

Теги

Похожие вопросы