Скрипт автозапуска в bash для майнкрафта

Я пытаюсь написать сценарий на 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.

Вместо обнаружения в реальном времени. Если сценарий запущен и процесс меняет статус, либо он переходит из существующего в несуществующее, либо наоборот, он будет продолжать выводить то, что было до изменения.

Пожалуйста, вставьте свой скрипт на shellcheck.net и попытайтесь реализовать содержащиеся там рекомендации.

Cyrus 28.05.2024 07:04

Попробуйте if pgrep minecraft; then ...

Renaud Pacalet 28.05.2024 07:45

В настоящее время рассмотрите возможность написания служебного файла systemd и использования systemd для управления службами.

KamilCuk 28.05.2024 08:05

Минимальное исправление — #! вместо !# и if [ "$status" = "true" ], хотя, как было предложено в предыдущем комментарии, if pgrep -f minecraft намного лучше. По касательной смотрите также Почему тестирование $? чтобы увидеть, выполнена ли команда успешно или нет, антишаблон?

tripleee 28.05.2024 10:06

Действительно, не делайте этого вообще. Как говорили другие, создайте службу systemd. Вам не нужно использовать pgrep или любой его эквивалент, когда вы осуществляете надлежащий контроль над процессом, потому что вещь, которую вы контролируете, просто запускается как прямой дочерний элемент супервизора. Это означает, что супервизор получает положительное уведомление, когда он завершает работу, но также может делать такие вещи, как перезапуск, проверку его статуса и т. д., просто глядя на его дочерние элементы; это более надежно (невозможно ошибочно найти разные процессы с одним и тем же именем) и более эффективно (не нужно сканировать все дерево процессов).

Charles Duffy 28.05.2024 15:14

@Saboteur, ты имеешь в виду & не && -- && вообще не создает никаких фоновых процессов, поэтому не устанавливает $!. (Если ./run.sh — это отдельный процесс, который является потомком, он не будет работать для установки $! в оболочке, которая его вызвала). Опять же, я все же рекомендую настроить правильную службу systemd, а не делать что-либо из этого.

Charles Duffy 28.05.2024 15:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Комментарий Сайруса об использовании 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, что является синтаксической ошибкой.

tripleee 28.05.2024 10:03

Это было решение, просто синтаксис был неправильный, в любом случае спасибо, я все равно использовал равенства вместо [ ], и это работает, если запускать его из того же окна, в котором находится сервер.

Cowardlycamper32 28.05.2024 13:05

Канонически это Shellcheck.net, а не .com.

Charles Duffy 28.05.2024 15:15

Другие вопросы по теме