использование pgrep, чтобы избежать нескольких экземпляров в цикле - PullRequest
0 голосов
/ 26 марта 2019

Я использую следующий скрипт (очень упрощенный), чтобы проверить, возникает ли какое-то условие для отображения пользовательского интерфейса.Скрипт работает в очень ограниченном дистрибутиве Linux на основе BusyBox, поэтому давайте помнить, что нет таких инструментов, как upstart / systemd или каких-либо других для управления запуском сценария на основе событий:

#!/bin/sh

while true; do
    if ./check-condition && pgrep -f ./start-ui; then
        ./start-ui &
    fi
done

Проблемаздесь при определенных обстоятельствах pgrep вызывается раньше, чем фоновый процесс установил его имя, и, следовательно, будет запущено несколько экземпляров ./start-ui процесса.

Можно эмулировать проблему, используя следующий код, иногда выводиз cat /proc/$!/cmdline равно bash / sh, а не /bin/sleep:

for _ in `seq 1 100`; do pkill sleep; exec /bin/sleep 3 & cat /proc/$!/cmdline; echo; done

Интересно, есть ли способ правильно использовать pgrep в данном сценарии?Я хотел бы избежать sleep s после выполнения фонового процесса, так как они будут влиять на отзывчивость системы в целом.Также я хотел бы избежать использования PID-файлов, так как они не обрабатывают запуск ./start-ui независимо от этого скрипта, что также имеет место.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...