Я просматриваю сценарий, который действительно перезапускает игровые серверы в случае их сбоя. Игровые серверы фактически запускаются в сеансе экрана через панель управления. Их необходимо перезапустить, прервав соответствующий сеанс экрана и запустив их снова в новом сеансе экрана с тем же именем. Я сделал этот сценарий сам, но на самом деле он не работает и вызывает ошибки.
#!/bin/bash
START='cd /home/test; ./GameServer +set parameters'
SCREEN_NAME="test"
while /bin/true; do
sleep 5
SERVER=`ps --User test | grep GameServer | grep -v grep | wc -l`
if [[ $SERVER -eq "0" ]]; then
screen -S $SCREEN_NAME-X quit ; screen -S $SCREEN_NAME -md $START
sleep 10
fi
done
Имя процесса - «игровой сервер», и проблема заключается в том, чтобы убить сеанс экрана, потому что он не завершится, и если я убью все сеансы экрана, экран, на котором запущен скрипт, также завершит работу.
test@de:~$ screen -list
There is a screen on:
31861.2-test (08/11/13 12:51:06) (Detached)
1 Socket in /var/run/screen/S-test.
test@de:~$ screen -r 2-test -X quit
No screen session found.
test@de:~$ screen -x 2-test -X quit
No screen session found.
test@de:~$ screen -S 2-test -X quit
No screen session found.
Я могу хотя бы присоединиться к вышеуказанному экрану с помощью «screen -x», и я также могу убить экран с тем же именем, используя приведенные выше команды, если я начну его как: «screen -S test». Я считаю, что в панели управления есть что-то, что запускает его по-другому, так что он не может подключиться с использованием имени.
Да ладно, не используйте для этого экран.
Используйте что-то, что действительно предназначено для наблюдения за процессами, и перезапускайте / возрождайте их, когда они умирают.
Все остальное - это просто изобретение колеса, и никогда не будет так хорошо и проверено.