Вопрос Запуск серверов при старте ОС

tenshik666

Premium
Пользователь
Сообщения
1 405
Решения
92
Доброго времени суток, дорогие форумчане!
Начну немного издалека. Свою первую VDS я настраивал по данному гайду - Как и рекомендовалось в гайде, в качестве ОС я выбрал Debian 11, и это меня вполне устраивало. Пока я не столкнулся с проблемами на стороне хостинга и не заинтересовался темой автоматического старта сервера при загрузке системы. Вариант с докерами мне не подошел, и я отложил данный вопрос вплоть до появления этого руководства - You must be logged in to see this link.
Я сделал все строго по инструкции, но итог нулевой. Я полез в интернет искать больше информации по данной теме, НО никак не могу его запустить.
Может ли хоть кто-то мне помочь разобраться в данной проблеме?
 
Последнее редактирование:
По правде говоря это можно сделать через unit-файл (в инете кучу гайдов есть) используя systemd, но я тебе настоятельно не рекомендую этого делать, потому что это банально неудобно. Особенно если у тебя больше 3 серверов.
 
Последнее редактирование:
Попробуй этот
Код:
[Unit]
Description=Server1
After=network.target

[Service]
User=Server1
WorkingDirectory=/home/minecraft/Server1
ExecStart=/bin/bash /home/minecraft/Server1/start.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
Сохрани файл в /etc/systemd/system/Server1.service
И загрузить его, введя команды
sudo systemctl daemon-reload
sudo systemctl enable Server1
sudo systemctl start Server1
 
В общем смотрите, попытаюсь объяснить по подробнее.
У меня есть файл mc_servers.service которые находится в /etc/systemd/system/
Содержимое файла:
INI:
[Unit]
Description=MC server
After=network.target

[Service]
Type=oneshot
User=mcserv
ExecStart=/bin/bash /home/mcserv/scripts/mc_servers.sh
RemainAfterExit=false

[Install]
WantedBy=multi-user.target
Скрипт запуска mc_servers.sh выглядит так:
Bash:
#!/bin/bash

# Имя пользователя, от имени которого будут запускаться экраны
USER="mcserv"

# Директории серверов Minecraft
SERVER_DIRS=(
    "/home/$USER/survival/"
    "/home/$USER/velocity/"
)

# Названия сринов в которых будут запускаться сервера
# Заметьте что они должны идти в таком-же порядке как и сервера, то есть если мы хотим чтобы ванила запустилась в скрине с именем "vanila", то ставим их в список под одинаковыми номерами.
SCREEN_NAMES=(
    "surv"
    "proxy"
)

# Скрипт открытия скринов и вызова скрипта "start.sh"
for i in "${!SERVER_DIRS[@]}"; do
    DIR="${SERVER_DIRS[i]}"
    SCREEN="${SCREEN_NAMES[i]}"
    if screen -list | grep -q "$SCREEN"; then
        echo "Окно $SCREEN уже запущенно!"
    else
        if [ ! -d "$DIR" ]; then
            echo "Директория $DIR не существует! Пропускаем сервер $SCREEN."
            continue
        fi
        echo "Запускаем сервер $SCREEN..."
        screen -dmS "$SCREEN" bash -c "cd $DIR && sh start.sh"
    fi
done
И при попытке старта я получаю вот такую ошибку:
Bash:
Mar 18 12:57:14 имя хоста systemd[1]: Starting MC server...
░░ Subject: A start job for unit mc_servers.service has begun execution
░░ Defined-By: systemd
░░ Support: https://www.debian.org/support
░░
░░ A start job for unit mc_servers.service has begun execution.
░░
░░ The job identifier is 1914.
Mar 18 12:57:14 имя хоста bash[221980]: Запускаем сервер surv...
Mar 18 12:57:14 имя хоста bash[221983]: Must be connected to a terminal.
Mar 18 12:57:14 имя хоста systemd[1]: mc_servers.service: Main process exited, code=exited, status=1/FAILURE
░░ Subject: Unit process exited
░░ Defined-By: systemd
░░ Support: https://www.debian.org/support
░░
░░ An ExecStart= process belonging to unit mc_servers.service has exited.
░░
░░ The process' exit code is 'exited' and its exit status is 1.
Mar 18 12:57:14 имя хоста systemd[1]: mc_servers.service: Failed with result 'exit-code'.
░░ Subject: Unit failed
░░ Defined-By: systemd
░░ Support: https://www.debian.org/support
░░
░░ The unit mc_servers.service has entered the 'failed' state with result 'exit-code'.
Mar 18 12:57:14 имя хоста systemd[1]: Failed to start MC server.
░░ Subject: A start job for unit mc_servers.service has failed
░░ Defined-By: systemd
░░ Support: https://www.debian.org/support
░░
░░ A start job for unit mc_servers.service has finished with a failure.
░░
░░ The job identifier is 1914 and the job result is failed.
При просмотре журнала через journalctl -u mc_servers.service я получаю такое:
Bash:
Mar 18 12:57:14 имя хоста systemd[1]: Starting MC server...
Mar 18 12:57:14 имя хоста bash[221980]: Запускаем сервер surv...
Mar 18 12:57:14 имя хоста bash[221983]: Must be connected to a terminal.
Mar 18 12:57:14 имя хоста systemd[1]: mc_servers.service: Main process exited, code=exited, status=1/FAILURE
Mar 18 12:57:14 имя хоста systemd[1]: mc_servers.service: Failed with result 'exit-code'.
Mar 18 12:57:14 имя хоста systemd[1]: Failed to start MC server.
Это то с чем возился я. Сейчас опробую ваши варианты.
 
Особенно если у тебя больше 3 серверов.
Серверов всего 2, это выживание и прокси которое я использую как базовый антибот/логинсервер
Также можно в crontab добавить запуск sh файла после запуска системы:
Код:
sudo -u пользователь crontab -e
@reboot /путь/
Про crontab мне говорили админы SH, но в итоге я про него так и не нашел внятной информации, можете рассказать об этом по подробнее?
Попробуй этот
Код:
[Unit]
Description=Server1
After=network.target

[Service]
User=Server1
WorkingDirectory=/home/minecraft/Server1
ExecStart=/bin/bash /home/minecraft/Server1/start.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
Сохрани файл в /etc/systemd/system/Server1.service
И загрузить его, введя команды
sudo systemctl daemon-reload
sudo systemctl enable Server1
sudo systemctl start Server1

Эм, а разве в User=Server1 не нужно будет указать своего пользователя в скрипте? А то вдруг я что то не так понял...

Заранее извиняюсь если затуплю, прошу относится с пониманием к моей неопытности в этом деле.
 
В общем смотрите, попытаюсь объяснить по подробнее.
У меня есть файл mc_servers.service которые находится в /etc/systemd/system/
Содержимое файла:
INI:
[Unit]
Description=MC server
After=network.target

[Service]
Type=oneshot
User=mcserv
ExecStart=/bin/bash /home/mcserv/scripts/mc_servers.sh
RemainAfterExit=false

[Install]
WantedBy=multi-user.target
Скрипт запуска mc_servers.sh выглядит так:
Bash:
#!/bin/bash

# Имя пользователя, от имени которого будут запускаться экраны
USER="mcserv"

# Директории серверов Minecraft
SERVER_DIRS=(
    "/home/$USER/survival/"
    "/home/$USER/velocity/"
)

# Названия сринов в которых будут запускаться сервера
# Заметьте что они должны идти в таком-же порядке как и сервера, то есть если мы хотим чтобы ванила запустилась в скрине с именем "vanila", то ставим их в список под одинаковыми номерами.
SCREEN_NAMES=(
    "surv"
    "proxy"
)

# Скрипт открытия скринов и вызова скрипта "start.sh"
for i in "${!SERVER_DIRS[@]}"; do
    DIR="${SERVER_DIRS[i]}"
    SCREEN="${SCREEN_NAMES[i]}"
    if screen -list | grep -q "$SCREEN"; then
        echo "Окно $SCREEN уже запущенно!"
    else
        if [ ! -d "$DIR" ]; then
            echo "Директория $DIR не существует! Пропускаем сервер $SCREEN."
            continue
        fi
        echo "Запускаем сервер $SCREEN..."
        screen -dmS "$SCREEN" bash -c "cd $DIR && sh start.sh"
    fi
done
И при попытке старта я получаю вот такую ошибку:
Bash:
Mar 18 12:57:14 имя хоста systemd[1]: Starting MC server...
░░ Subject: A start job for unit mc_servers.service has begun execution
░░ Defined-By: systemd
░░ Support: https://www.debian.org/support
░░
░░ A start job for unit mc_servers.service has begun execution.
░░
░░ The job identifier is 1914.
Mar 18 12:57:14 имя хоста bash[221980]: Запускаем сервер surv...
Mar 18 12:57:14 имя хоста bash[221983]: Must be connected to a terminal.
Mar 18 12:57:14 имя хоста systemd[1]: mc_servers.service: Main process exited, code=exited, status=1/FAILURE
░░ Subject: Unit process exited
░░ Defined-By: systemd
░░ Support: https://www.debian.org/support
░░
░░ An ExecStart= process belonging to unit mc_servers.service has exited.
░░
░░ The process' exit code is 'exited' and its exit status is 1.
Mar 18 12:57:14 имя хоста systemd[1]: mc_servers.service: Failed with result 'exit-code'.
░░ Subject: Unit failed
░░ Defined-By: systemd
░░ Support: https://www.debian.org/support
░░
░░ The unit mc_servers.service has entered the 'failed' state with result 'exit-code'.
Mar 18 12:57:14 имя хоста systemd[1]: Failed to start MC server.
░░ Subject: A start job for unit mc_servers.service has failed
░░ Defined-By: systemd
░░ Support: https://www.debian.org/support
░░
░░ A start job for unit mc_servers.service has finished with a failure.
░░
░░ The job identifier is 1914 and the job result is failed.
При просмотре журнала через journalctl -u mc_servers.service я получаю такое:
Bash:
Mar 18 12:57:14 имя хоста systemd[1]: Starting MC server...
Mar 18 12:57:14 имя хоста bash[221980]: Запускаем сервер surv...
Mar 18 12:57:14 имя хоста bash[221983]: Must be connected to a terminal.
Mar 18 12:57:14 имя хоста systemd[1]: mc_servers.service: Main process exited, code=exited, status=1/FAILURE
Mar 18 12:57:14 имя хоста systemd[1]: mc_servers.service: Failed with result 'exit-code'.
Mar 18 12:57:14 имя хоста systemd[1]: Failed to start MC server.
Это то с чем возился я. Сейчас опробую ваши варианты.
Попробуй изменить команду screen'a на:
screen -d -m
Объединено

Я просто знаю только про cron и то чуть чуть, а про crontab мои познания равны около нулю.
Crontab это команда для изменения задач в cron
 
Попробуй изменить команду screen'a на:
screen -d -m
Объединено


Crontab это команда для изменения задач в cron
По типу screen -d -m -S ?
Объединено

В общем попробовал, эффекта ноль, вот журнал:
Bash:
Mar 18 13:30:22 имя хоста systemd[1]: Starting MC server...
Mar 18 13:30:22 имя хоста bash[225925]: Запускаем сервер surv...
Mar 18 13:30:22 имя хоста systemd[1]: mc_servers.service: Succeeded.
Mar 18 13:30:22 cимя хоста systemd[1]: Finished MC server.
 
Последнее редактирование:
Эм, а разве в User=Server1 не нужно будет указать своего пользователя в скрипте? А то вдруг я что то не так понял...
Да, тебе нужно указывать своего пользователя, под которым будет запускаться сервер
 
Назад
Сверху Снизу