
Итак, я размещаю игру, которая очень капризна и может часто вылетать на Linux. Я создал эту cron-задачу для перезапуска экрана и игры в случае сбоя:
#!/bin/bash
for t in {1..12} do
if [ -z "$(ps -C game | grep game)" ]
then
/usr/bin/screen -d -m -S ss13 /usr/local/bin/game /home/gamefolder/game/game.dmb 1336
fi
sleep 5
done
Задание cron отлично работает для запуска игрового сервера, если экранное имя не существует. Однако если игра запущена и происходит сбой, задание cron не работает, и игра не перезапускается.
Однако игра уже запущена на экране с именем ss13, и сам экран не вылетает, только игра. Так что я думаю, что происходит следующее: когда игра вылетает, она пытается создать новый экран с игрой, но, очевидно, не может. Есть ли лучший способ сделать это? Я все еще полный нуб в Linux.
решение1
Это не совсем работа для cron
, я бы предложил что-то вроде следующего, запущенного внутри screen
сеанса:
while :; do
/usr/local/bin/game /home/gamefolder/game/game.dmb 1336
done
:
является сокращением для true
.
Вышеизложенное предполагает, что игра не демонизируется. В этом случае используйте:
while :; do
if [ -z "$(ps -C game | grep game)" ]; then
/usr/local/bin/game /home/gamefolder/game/game.dmb 1336
fi
sleep 5
done
решение2
Я знаком с использованием screen, но я не совсем уверен, что вы пытаетесь здесь сделать. Если вы хотите, чтобы сервер автоматически перезапускался, то вам не нужен screen для этого. Возможно, вы предпочтете скрипт, который перезапускается сразу после сбоя (а не через 5 секунд).
#!/bin/bash
for t in {1..12}
do
/usr/local/bin/game /home/gamefolder /game/game.dmb 1336
done