Я использую следующий скрипт (очень упрощенный), чтобы проверить, возникает ли какое-то условие для отображения пользовательского интерфейса.Скрипт работает в очень ограниченном дистрибутиве 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
независимо от этого скрипта, что также имеет место.