Я пытаюсь написать сценарий на bash для запуска сценария (run.sh), когда pgrep -f minecraft ничего не возвращает.
!#/bin/bash
status=false
while :
do
pgrep -f minecraft && status=true
if $status = true; then
echo "up"
else
echo "down"
echo "restarting in 10 seconds, pres CTRL + C to cancel"
sleep 10
./run.sh
fi
done
Я ожидал, что это запустится run.sh, когда он не сможет найти процесс для Minecraft.
Вместо обнаружения в реальном времени. Если сценарий запущен и процесс меняет статус, либо он переходит из существующего в несуществующее, либо наоборот, он будет продолжать выводить то, что было до изменения.
Попробуйте if pgrep minecraft; then ...
В настоящее время рассмотрите возможность написания служебного файла systemd и использования systemd для управления службами.
Минимальное исправление — #! вместо !# и if [ "$status" = "true" ], хотя, как было предложено в предыдущем комментарии, if pgrep -f minecraft намного лучше. По касательной смотрите также Почему тестирование $? чтобы увидеть, выполнена ли команда успешно или нет, антишаблон?
Действительно, не делайте этого вообще. Как говорили другие, создайте службу systemd. Вам не нужно использовать pgrep или любой его эквивалент, когда вы осуществляете надлежащий контроль над процессом, потому что вещь, которую вы контролируете, просто запускается как прямой дочерний элемент супервизора. Это означает, что супервизор получает положительное уведомление, когда он завершает работу, но также может делать такие вещи, как перезапуск, проверку его статуса и т. д., просто глядя на его дочерние элементы; это более надежно (невозможно ошибочно найти разные процессы с одним и тем же именем) и более эффективно (не нужно сканировать все дерево процессов).
@Saboteur, ты имеешь в виду & не && -- && вообще не создает никаких фоновых процессов, поэтому не устанавливает $!. (Если ./run.sh — это отдельный процесс, который является потомком, он не будет работать для установки $! в оболочке, которая его вызвала). Опять же, я все же рекомендую настроить правильную службу systemd, а не делать что-либо из этого.





Комментарий Сайруса об использовании shellcheck.net для исправления этой проблемы
#!/bin/bash
status=false
while :
do
pgrep -f minecraft && status=true
if [ $status = true ]; then
echo "up"
else
echo "down"
echo "restarting in 10 seconds, pres CTRL + C to cancel"
sleep 10
./run.sh
fi
done
Изменения заключались в следующем:
!# -> #!
и = -> [ ]
Редактировать 1: исправлен синтаксис сравнения на основе комментариев.
Редактировать 2: исправлено использование Shellcheck.com в Shellcheck.net.
Это недопустимый синтаксис. Или, скорее, вы в конечном итоге запускаете либо true [ ] true, что номинально работает (он запускается true и игнорирует свои аргументы), либо [ ] true, что является синтаксической ошибкой.
Это было решение, просто синтаксис был неправильный, в любом случае спасибо, я все равно использовал равенства вместо [ ], и это работает, если запускать его из того же окна, в котором находится сервер.
Канонически это Shellcheck.net, а не .com.
Пожалуйста, вставьте свой скрипт на shellcheck.net и попытайтесь реализовать содержащиеся там рекомендации.